Но действительно ли a().n
временно? Рассмотрим этот код:
class a
{
public:
int m;
int &n;
a():m(2),n(m)
{
cout<< "A's constructor"<<endl;
}
a(int& _n):m(2),n(_n)
{
cout<< "A's constructor"<<endl;
}
};
int main()
{
a().n = 20; // (1)
int n = 0;
a(n).n // (2)
return 0;
}
Строка (2)
ясно показывает, что .n
не является временным. Этого не должно быть, так как это ссылка на локальную переменную n
.
Но тогда компилятор не может знать, на что будет ссылаться n
. Можно даже сделать n(rand_bool() ? m : _n)
, и это должно сработать.
Компиляция вместо этого использует систему типов, чтобы знать, что должно быть назначено или нет.
Например, литерал 9
являетсяpr-значение типа int
. Вы не можете присвоить ему:
9 = 8; // nope
В вашем коде a()
- это значение или тип a
. Все его члены значения также являются. Вот почему a().m
не будет работать. m
- это prvalue.
Но, a().n
- это lvalue, потому что n
- это ссылка на lvalue. Независимо от того, на какую переменную он указывает.