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