我相信表达式T()
会创建一个右值(按标准)。但是,以下代码可以编译(至少在 gcc4.0 上):
class T {};
int main()
{
T() = T();
}
我知道从技术上讲这是可能的,因为可以在临时对象上调用成员函数,而上面只是在从 first 创建的 rvalue 临时对象上调用 operator= T()
。
但从概念上讲,这就像为右值分配一个新值。允许这样做有充分的理由吗?
编辑:我觉得这很奇怪的原因是它严格禁止内置类型但允许用户定义类型。例如,int(2) = int(3)
不会编译,因为那是“赋值中的无效左值”。
所以我想真正的问题是,这种在语言中内置的有点不一致的行为是有原因的吗?还是出于某种历史原因?(例如,仅允许在右值表达式上调用 const 成员函数在概念上会更合理,但不能这样做,因为这可能会破坏一些现有代码。)