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