最近我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中只是一个忽略。在C ++ 11之前,没有ref限定的方法,因此有人忘记了更改标准的行为。
为使用“脏”代码的人向后兼容而保留:
std::string("a") = "gds";
出于某些奇怪的原因。
关于将来添加它-可能的。但是,首先必须弃用旧的operator=
,然后再删除它,因为它会导致上面的代码无法编译。即使这样,某些编译器仍可能支持它以实现向后标准兼容性
类似,时间在这个决定中起着作用。带有Ref限定的成员函数已添加到C ++ 11语言中,而std::string
自C ++ 98起就出现了。更改标准库中某些内容的定义不是一件容易的事,因为它可能不必要地破坏现有代码。在这种情况下,不应只看为什么应该允许这种奇怪的分配(即寻找用例)。相反,还应该看看为什么不应该执行这种怪异的任务(即查看好处,并权衡工作代码可能破坏时的潜在痛苦)。这种变化多久会在现实的编码场景中产生影响?
[看评论,对一个建议的用例的反驳是“他们可以[另一种方法]。]]是的,他们可以,但是如果没有呢?最初设计结构(std::string
)时,提出替代方案会很有成效。但是,一旦该结构得到广泛使用,您就必须考虑当前未使用替代方法的现有代码。是否有足够的好处可以减轻您可能造成的痛苦?实际上,这种变化会经常引起错误吗?在不会触发另一个警告的情况下,此类错误有多普遍?这些是语言设计师要解决的一些问题。
[请理解,我并不是说不能进行更改,而只是需要仔细考虑它。