这个成语是什么,什么时候应该使用?它解决了哪些问题?当使用C++ 11时,成语是否会改变?
虽然在许多地方已经提到过,但我们没有任何单一的"它是什么"问题和答案,所以在这里.以下是前面提到的地方的部分列表:
c++ c++-faq copy-constructor assignment-operator copy-and-swap
例如,stdlibc ++具有以下内容:
unique_lock& operator=(unique_lock&& __u)
{
if(_M_owns)
unlock();
unique_lock(std::move(__u)).swap(*this);
__u._M_device = 0;
__u._M_owns = false;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
为什么不直接将两个__成员分配给*?交换是否意味着__u被分配了*this成员,后来才分配0和false ...在这种情况下交换正在做不必要的工作.我错过了什么?(unique_lock :: swap只对每个成员执行std :: swap)
通常情况下,我们定义拷贝赋值操作符类型T为T& operator=(const T&)和移动赋值运算符类型T的T& operator=(T&&).
但是,当我们使用值参数而不是引用时会发生什么?
class T
{
public:
T& operator=(T t);
};
Run Code Online (Sandbox Code Playgroud)
这应该使T既可以复制也可以移动.但是,我想知道的是什么是语言后果T?
特别:
T根据规范,这是否算作复制赋值运算符?T根据规范,这是否算作移动赋值运算符?T有一个编译器生成的拷贝赋值运算符?T有一个编译器生成的移动赋值运算符?std::is_move_assignable有何影响?这是使用移动构造函数为大多数类定义移动赋值的一种非常简单的方法:
class Foo {
public:
Foo(Foo&& foo); // you still have to write this one
Foo& operator=(Foo&& foo) {
if (this != &foo) { // avoid destructing the only copy
this->~Foo(); // call your own destructor
new (this) Foo(std::move(foo)); // call move constructor via placement new
}
return *this;
}
// ...
};
Run Code Online (Sandbox Code Playgroud)
这个调用你自己的析构函数的序列是否跟随在标准C++ 11中的this指针安全位置新增?
c++ placement-new move-semantics c++11 move-assignment-operator