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
相关产品推荐
相关产品推荐

