Я считаю, что выражение T()
создает rvalue (по стандарту). Однако следующий код компилируется (по крайней мере, на gcc4.0):
class T {};
int main()
{
T() = T();
}
Я знаю, что это технически возможно, потому что функции-члены могут быть вызваны во временных рядах, а выше просто вызывает оператор = на временное значение rvalue, созданное с первого T()
.
Но концептуально это похоже на присвоение нового значения rvalue. Есть ли веская причина, почему это разрешено?
Изменить: причина, по которой я нахожу этот нечетный, строго запрещена для встроенных типов, которые все же разрешены для пользовательских типов. Например, int(2) = int(3)
не будет компилироваться, потому что это "недопустимое значение lvalue в присваивании".
Итак, я думаю, что реальный вопрос в том, было ли это несколько непоследовательное поведение, встроенное в язык по какой-то причине? Или это по какой-то исторической причине? (Например, было бы концептуально более разумным, чтобы разрешать только функции-члены-члены в выражениях rvalue, но это невозможно сделать, поскольку это может сломать некоторый существующий код.)