Why is std::string#39;s member operator= not lvalue ref-qualified(为什么std::字符串的成员运算符=不是左值引用限定的)
问题描述
我最近learned成员函数可以ref-qualified,这允许我写
struct S {
S& operator=(S const&) & // can only be used if the implicit object is an lvalue
{
return *this;
}
};
S operator+(S const &, S const &) {
return {};
}
从而阻止用户执行以下操作
S s{};
s + s = S{}; // error
但是,我看到std::string成员operator=does not do this。因此,编译以下代码时没有任何警告
std::string s;
s + s = s;
允许这样做有原因吗?
如果没有,将来是否可以添加ref限定符,或者这会以某种方式破坏现有代码吗?
推荐答案
时间可能在这一决定中发挥作用。引用限定的成员函数是用C++11添加到语言中的,而std::string从C++98开始就存在了。更改标准库中某些东西的定义不是一件轻而易举的事情,因为这可能会不必要地破坏现有代码。在这种情况下,人们不应该只考虑为什么应该允许这种奇怪的分配(例如,寻找用例)。相反,人们还应该考虑为什么应该不允许这种奇怪的任务(即,查看好处,并权衡它们与其他工作代码崩溃时的潜在痛苦)。此更改多久会在实际编码方案中产生影响?
查看评论,一个提议的用例的反面是"他们可以只是[另一种方法]。"是的,他们可以,但如果他们不这样做呢?在最初设计结构(std::string)时,提出替代方案是有成效的。然而,一旦该结构被广泛使用,您就必须考虑到当前未使用该替代方法的现有代码。对于你可能引起的疼痛,有足够的好处吗?这种改变真的能足够频繁地捕捉到错误吗?在不会触发另一个警告的上下文中,这种错误有多常见?(例如,在if语句的条件中使用赋值而不是相等很可能已经生成了警告。)这些是语言设计人员努力解决的一些问题。
请理解,我并不是说不能进行更改,只是需要仔细考虑。
这篇关于为什么std::字符串的成员运算符=不是左值引用限定的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么std::字符串的成员运算符=不是左值引用限定的
基础教程推荐
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- CString 到 char* 2021-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- 初始化列表*参数*评估顺序 2021-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
