当将STL容器复制到自身中时,STL容器是否应避免将元素复制到自身中?

ant*_*_rh 23 c++ stl c++-standard-library language-lawyer

问题是关于自我分配。例如,将向量复制到自身中:

std::vector<std::string> vec(5, "hello");
vec = vec;
Run Code Online (Sandbox Code Playgroud)

上面的代码应该对字符串执行5个字符串赋值操作,还是什么都不做?我的意思是以下检查是否有效:

std::vector operator=(const std::vector &rhs)
{
    if (this == &rhs)
        { return *this; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我正在研究自己的std::variant类实现(只是为了好玩),并且对我是否应该在自赋值运算符的开头添加自赋值检查感兴趣,还是应该将包含的元素复制到自身中?

我了解这通常并不重要。您不应创建利用复制事实的类。但是我很感兴趣该标准是否对此有所说明。

eer*_*ika 18

标准指定的容器分配的前后条件(引用最新草案):

[tab:container.req]

r = a
Run Code Online (Sandbox Code Playgroud)

确保:r == a。

这允许但不要求进行自我分配检查。

  • 为了使答案更完整:[utility.arg.requirements](表29)指定复制构造函数不更改参数,并且两个值相等。 (9认同)
  • @anton_rh本身不是UB,但实际上不能与大多数标准设施一起使用。 (5认同)

lis*_*rus 0

检查this == &rhs实际上是一个非常著名的习惯用法lhs,通过保证和是不同的对象来帮助确保您不会破坏任何东西rhs。所以,这是有效的并且实际上是值得鼓励的。

不过,我不知道是否需要 STL 容器来进行检查。

  • @NicolBolas 请注意,语言律师标签是由非 OP 的人添加的,并且是在 lisyarus 发布此答案 10 分钟后添加的。(并不是说您的评论不是很好的反馈,只是在这种情况下严重依赖语言律师标签的存在存在问题。) (2认同)