You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中为何允许将左值赋值给右值?示例代码编译无报错解析

为什么s + s = s;能通过编译?

你提到的这段代码:

string s = "hello";
s + s = s; // 无编译错误/警告

之所以能通过编译,核心原因是**std::string的赋值运算符(operator=)没有限制只能被左值调用**:

  • s + s会生成一个临时的std::string右值对象
  • C标准默认允许右值调用非const成员函数,而std::string的operator=是普通成员函数,没有用C11引入的**引用限定符(ref-qualifier)**限制调用者必须是左值
  • 赋值操作会把s的值赋给这个临时对象,但临时对象在语句结束后立刻销毁,整个操作没有实际效果,但语法完全合法

如果想要避免这种无意义的操作,可以自定义字符串类时给operator=加上左值引用限定符:

class MyString {
public:
    MyString& operator=(const MyString&) & = default; // 仅允许左值对象调用赋值
};

此时类似MyString() = MyString();的代码就会触发编译错误,因为右值无法调用带&限定的成员函数。

内容的提问来源于stack exchange,提问作者Samboy786

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:42:00