相关疑难解决方法(0)

移动赋值运算符和`if(this!=&rhs)`

在类的赋值运算符中,通常需要检查所分配的对象是否是调用对象,这样就不会搞砸了:

Class& Class::operator=(const Class& rhs) {
    if (this != &rhs) {
        // do the assignment
    }

    return *this;
}
Run Code Online (Sandbox Code Playgroud)

移动赋值运算符需要相同的东西吗?是否有过这样的情况this == &rhs

? Class::operator=(Class&& rhs) {
    ?
}
Run Code Online (Sandbox Code Playgroud)

c++ move-semantics c++11 move-assignment-operator

117
推荐指数
3
解决办法
4万
查看次数

在移动赋值和移动构造函数方面实现std :: swap

以下是可能的定义std::swap:

template<class T>
void swap(T& a, T& b) {
  T tmp(std::move(a));
  a = std::move(b);
  b = std::move(tmp);
}
Run Code Online (Sandbox Code Playgroud)

我相信

  1. std::swap(v,v) 保证没有效果
  2. std::swap 可以如上实现.

以下引用似乎暗示这些信念是矛盾的.

17.6.4.9函数参数[res.on.arguments]

1除非另有明确说明,否则以下各项均适用于C++标准库中定义的函数的所有参数.

...

  • 如果函数参数绑定到右值引用参数,则实现可以假定此参数是对此参数的唯一引用.[注意:如果参数是T &&形式的通用参数并且绑定了类型A的左值,则参数绑定到左值引用(14.8.2.1),因此不包含在前一句中. - 结束注释] [注意:如果程序在将左值传递给库函数时将左值转换为x值(例如通过使用参数move(x)调用函数),程序实际上会要求该函数处理该左值作为临时的.实现可以自由地优化别名检查,如果参数是左值,则可能需要这些检查.-endnote]

(感谢霍华德Hinnant(欣南特)用于提供报价)

让我们v从标准模板库中获取一些可移动类型的对象并考虑该调用std::swap(v, v).在该行a = std::move(b);以上,这是内部的情况T::operator=(T&& t)的是this == &b,这样的参数是唯一的参考.这违反了上面的要求,因此该行在a = std::move(b)调用时调用未定义的行为std::swap(v, v).

这里有什么解释?

c++ stl move-semantics c++11

10
推荐指数
2
解决办法
2030
查看次数