Вярвам, че изразът T()
създава rvalue (по стандарта). Следният код обаче се компилира (поне на gcc4.0):
class T {};
int main()
{
T() = T();
}
Знам, че технически това е възможно, защото функциите-членове могат да бъдат извикани на временни елементи и горното е просто извикване на operator= на rvalue temporary, създаден от първия T()
.
Но концептуално това е като присвояване на нова стойност на rvalue. Има ли основателна причина това да е разрешено?
Редактиране: Причината да намирам това за странно е, че е строго забранено за вградени типове, но е позволено за дефинирани от потребителя типове. Например int(2) = int(3)
няма да се компилира, защото това е "невалидна lvalue в присвояването".
Така че предполагам, че истинският въпрос е дали това донякъде непоследователно поведение е вградено в езика с причина? Или е там по някаква историческа причина? (Например би било концептуално по-правилно да се позволи само const членски функции да бъдат извиквани на rvalue изрази, но това не може да бъде направено, защото може да наруши някои съществуващ код.)