cig*_*ien 5 c++ operator-overloading stdstring ref-qualifier
我最近了解到成员函数可以是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= 并没有这样做。所以下面的代码编译时没有警告
std::string s;
s + s = s;
有理由允许这样做吗?
如果没有,将来是否可以添加引用限定符,或者会以某种方式破坏现有代码吗?
时机很可能在这一决定中发挥了作用。Ref 限定的成员函数是在 C++11 中添加到语言中的,而std::string自 C++98 起就已存在。更改标准库中某些内容的定义并不是一件容易的事,因为它可能会不必要地破坏现有代码。在这种情况下,人们不应该专门考虑为什么应该允许这种奇怪的分配(即寻找用例)。相反,人们还应该看看为什么这种奇怪的分配应该被禁止(即看看好处,并权衡它们与其他工作代码中断时潜在的痛苦)。这种变化在实际编码场景中多久会产生影响?
查看评论,对一个提议的用例的反驳是“他们可以[另一种方法]”。是的,他们可以,但如果他们不这样做怎么办?在最初设计结构时提出替代方案是富有成效的 ( std::string)。然而,一旦该结构被广泛使用,您就必须考虑当前不使用替代方案的现有代码。对于您可能造成的痛苦是否有足够的好处?这种改变实际上会经常发现错误吗?在不会触发另一个警告的情况下,此类错误有多常见?(举个例子,在语句的条件中使用赋值而不是相等if可能已经生成警告。)这些是语言设计者要解决的一些问题。
请理解,我并不是说不能改变,只是说需要仔细考虑。
| 归档时间: | 
 | 
| 查看次数: | 184 次 | 
| 最近记录: |