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