June 16 [Issue 24612] New: Explicitly given `auto ref` parameter can’t bind by lvalue by value | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=24612 Issue ID: 24612 Summary: Explicitly given `auto ref` parameter can’t bind by lvalue by value Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: enhancement Priority: P1 Component: dmd Assignee: nobody@puremagic.com Reporter: qs.il.paperinik@gmail.com ```d void f(T)(auto ref T x) {} void main() { int x; f!long(x); // Error: template `f` is not callable using argument types `!(long)(int)` } ``` This should instantiate `f` as `f!long(long x)`, as `int` converts to `long` and `cast(long)x` is an rvalue. I don’t know how far with implicit conversions this should go, but it should work for built-in integer and floating-point types. It should also work for class/interface types with inheritance relationship, and while binding those by `auto ref` is weird to do explicitly, such a binding might end up from templates that bind arbitrary type objects that happen to be class handles in the user’s code. Then: ```d Exception e = new Exception(""); f!Object(e); // Currently error, should be pass-by-value ``` With my proposed fix for Issue 24611, users could opt-into `ref` explicitly if they need to. -- |
Copyright © 1999-2021 by the D Language Foundation