为什么std :: string的成员运算符=左值引用不合格

问题描述 投票:1回答:2

最近我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++ operator-overloading stdstring ref-qualifier
2个回答
0
投票

无法确定为什么标准不禁止您提出的行为,但是有一些可能的解释:

  1. 这在C ++ 11中只是一个忽略。在C ++ 11之前,没有ref限定的方法,因此有人忘记了更改标准的行为。

  2. 为使用“脏”代码的人向后兼容而保留:

std::string("a") = "gds";

出于某些奇怪的原因。

关于将来添加它-可能的。但是,首先必须弃用旧的operator=,然后再删除它,因为它会导致上面的代码无法编译。即使这样,某些编译器仍可能支持它以实现向后标准兼容性


0
投票

类似,时间在这个决定中起着作用。带有Ref限定的成员函数已添加到C ++ 11语言中,而std::string自C ++ 98起就出现了。更改标准库中某些内容的定义不是一件容易的事,因为它可能不必要地破坏现有代码。在这种情况下,不应只看为什么应该允许这种奇怪的分配(即寻找用例)。相反,还应该看看为什么不应该执行这种怪异的任务(即查看好处,并权衡工作代码可能破坏时的潜在痛苦)。这种变化多久会在现实的编码场景中产生影响?

[看评论,对一个建议的用例的反驳是“他们可以[另一种方法]。]]是的,他们可以,但是如果没有呢?最初设计结构(std::string)时,提出替代方案会很有成效。但是,一旦该结构得到广泛使用,您就必须考虑当前未使用替代方法的现有代码。是否有足够的好处可以减轻您可能造成的痛苦?实际上,这种变化会经常引起错误吗?在不会触发另一个警告的情况下,此类错误有多普遍?这些是语言设计师要解决的一些问题。

[请理解,我并不是说不能进行更改,而只是需要仔细考虑它。

© www.soinside.com 2019 - 2024. All rights reserved.