On Monday, 22 June 2015 at 19:05:28 UTC, kinke wrote:
On Monday, 22 June 2015 at 16:54:50 UTC, Marc Schütz wrote:
With the difference that C++ requires const-ness.

Yep, so `in ref T` translating to `scope const ref T` would be D's convenient and safe counterpart to C++' `const T&` parameters, for their main use case: passing pure-input arguments of types which are or may be costly to copy (post-blit ctor, dtor, or simply big). I explicitly mention 'may be' here because in templates one often doesn't know (containers...).

To clarify: What I meant by my comment was that const-ness should not be a precondition for allowing rvalue refs. Mutable rvalue refs are fine.


As I have already pointed out in another thread, I'd go one step further and propose an extremely convenient `in T` for this very common use case:

* The argument is passed by value (`const T`) if the compiler assumes moving/copying is more efficient than passing a reference (with its indirection on the callee side) for the particular target environment (hardware, ABI), e.g., for plain-old-datatypes T fitting into 1-2 registers, and Object references obviously. * Otherwise, the argument is passed by-ref (`in ref T`). As `in T` doesn't mention any ref at all, it's clear that the hidden reference cannot escape.

Theoretically, `immutable ref` by itself would already allow these semantics (without the `scope` that `in` implies). Because (disregarding identity/addresses) for an immutable object there is no observable difference between pass-by-value and pass-by-reference. The same is not always true for `const ref`, whenever aliasing is possible:

    void foo(const ref int a, ref int b) {
        int x = a;
        b++;
assert(x == a); // can fail if both refer to the same variable
        // similar with global variables
    }

To guarantee this from the caller's POV, the callee must be pure and the parameters must be known not to alias each other.

Reply via email to