c++ - 为什么允许 T() = T()?

标签 c++ operator-overloading language-design rvalue temporary-objects

我相信表达式 T() 创建了一个右值(按标准)。但是,以下代码可以编译(至少在 gcc4.0 上):

class T {};

int main()
{
    T() = T();
}

我知道从技术上讲这是可能的,因为可以在临时对象上调用成员函数,而上面只是在从第一个 T() 创建的右值临时对象上调用 operator=。

但从概念上讲,这就像为右值分配一个新值。是否有充分的理由允许这样做?

编辑: 我觉得这很奇怪的原因是它在内置类型上是严格禁止的,而在用户定义类型上却是允许的。例如,int(2) = int(3) 不会编译,因为这是“赋值中的无效左值”。

所以我想真正的问题是,这种在语言中内置的有些不一致的行为是有原因的吗?还是出于某种历史原因? (例如,只允许在右值表达式上调用 const 成员函数在概念上会更合理,但不能这样做,因为这可能会破坏一些现有代码。)

最佳答案

之所以允许这样做,纯粹是因为运算符重载,并且您可能会重载 operator = 来做一些更花哨的事情,比如打印到控制台,或者锁定互斥锁,或者其他任何事情。

关于c++ - 为什么允许 T() = T()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926640/

相关文章:

c++ - 如果作为参数传递的仿函数不带参数,则启用模板

c++ - 如何编译Boost多线程程序?

C++ Time 类在 checkDay 函数中没有编译错误、执行停止和应用程序崩溃错误

c++ - 如何使用模板函数减去两个对象?

c# - 为什么 C# 3.0 对象初始值设定项构造函数括号是可选的?

c# - "direct"虚拟调用与 C# 中的接口(interface)调用的性能

variables - 为什么变量名中不能包含空格?

python - 在 tensorflow 中导入图形时使用新操作

C++ 重载运算符,解引用引用

C++,打印输出 (<<) 运算符重载