On Friday, 2 May 2014 at 08:17:09 UTC, Mark Isaacson wrote:
I'm in the process of learning/practicing D and I noticed something that seems peculiar coming from a C++ background:

If I compile and run:

void fun(const ref int x) {
  //Stuff
}

unittest {
  fun(5); //Error! Does not compile
}

I get the specified error in my unit test. I understand that the cause is that I've attempted to bind ref to an r-value, what's curious is that in C++, the compiler realizes that this is a non-issue because of 'const' and just 'makes it work'. Is there a rationale behind why D does not do this? Is there a way to write 'fun' such that it avoids copies but still pledges const-correctness while also allowing r-values to be passed in?

There is `auto ref`, but it only works for templates and is somewhat different:

    void fun()(auto ref const int x) {
        // Stuff
    }

    unittest {
        fun(5);    // pass by value
        int a = 5;
        fun(a);    // pass by ref
    }

It generates two functions, with and without ref respectively.

Allowing rvalues to bind to ref (not only const) has been discussed on several occasions, but I don't remember the outcome. Here is one discussion:

http://forum.dlang.org/thread/ntsyfhesnywfxvzbe...@forum.dlang.org

Reply via email to