why std.stdio.File is a struct?

Namespace via Digitalmars-d digitalmars-d at puremagic.com
Sun Oct 23 03:15:33 PDT 2016


On Sunday, 23 October 2016 at 06:36:21 UTC, Jonathan M Davis 
wrote:
> You can mark a parameter as ref, and you get something similar 
> to C++'s &, except that it only works on parameters, return 
> types, and the variable for the current element in a foreach 
> loop (you can't declare local variables that are ref), and ref 
> parameters only ever accept lvalues, even if they're const. e.g.
>
> void foo(ref int i) {...}
>
> ref int bar() { return _i; }
>
> foreach(i, ref e; arr) {...}
>
> I think that most D code just passes structs around without 
> worrying about the cost of copying unless the struct is 
> particularly large or profiling has shown that copying it is 
> too expensive. For a lot of stuff, it simply isn't a problem. 
> And when it is, there's ref, or the struct can be put on the 
> heap and passed around by pointer. But because we don't have an 
> equivalent for const& that accepts rvalues, using ref simply to 
> avoid copying can get annoying. So, it doesn't make much sense 
> to do it unless it's actually necessary (whereas a lot of C++ 
> code does it just in case it matters).
>
> There is talk of possibly adding a way to pass rvalues by ref 
> in D, in which case, you would get something similar to C++ 
> const&, but there are problems caused by C++'s approach that we 
> don't want in D, and D's const is enough more restrictive than 
> C++ const that whatever we do can't be tied to const.
>
> - Jonathan M Davis

There is still the way to use an universal rvalue => lvalue 
conversion function.


More information about the Digitalmars-d mailing list