Why is it possible to call non-const member functions of rvalues but a compile error to modify members or rvalues directly?

Johannes Loher johannes.loher at fg4f.de
Sun Jun 14 10:12:40 UTC 2020


On Saturday, 13 June 2020 at 12:47:31 UTC, Stanislav Blinov wrote:
> [...]
> The temporary exists until the end of full expression, or until 
> the end of enclosing statement. It is simply not an lvalue for 
> the caller, but it certainly exists, and so its interface must 
> function.

So public data members are not part of the interface? I 
understand that it probably doesn't make much sense to mutate 
data members of an rvalue but this just looks very inconsistent 
to me, in particular if you consider the fact that you can also 
call member functions with the = syntax:
```
struct A
{

     auto a(int _a)
     {
         return this._a = _a;
     }

     int _a = 0;
}

void main
{
     static assert(__traits(compiles, { A().a = 2; })); // this is 
ok but looks like it shouldn’t be
}
```


More information about the Digitalmars-d-learn mailing list