相关疑难解决方法(0)

什么是复制和交换习语?

这个成语是什么,什么时候应该使用?它解决了哪些问题?当使用C++ 11时,成语是否会改变?

虽然在许多地方已经提到过,但我们没有任何单一的"它是什么"问题和答案,所以在这里.以下是前面提到的地方的部分列表:

c++ c++-faq copy-constructor assignment-operator copy-and-swap

1907
推荐指数
5
解决办法
34万
查看次数

为什么有些人使用交换进行移动分配?

例如,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)

c++ rvalue-reference move-semantics copy-and-swap c++11

56
推荐指数
2
解决办法
2万
查看次数

使用值而不是引用来对赋值运算符进行分支

这个问题来自这个答案提出的问题.

通常情况下,我们定义拷贝赋值操作符类型TT& operator=(const T&)和移动赋值运算符类型TT& operator=(T&&).

但是,当我们使用值参数而不是引用时会发生什么?

class T
{
public:
  T& operator=(T t);
};
Run Code Online (Sandbox Code Playgroud)

这应该使T既可以复制也可以移动.但是,我想知道的是什么是语言后果T

特别:

  1. T根据规范,这是否算作复制赋值运算符?
  2. T根据规范,这是否算作移动赋值运算符?
  3. T有一个编译器生成的拷贝赋值运算符?
  4. T有一个编译器生成的移动赋值运算符?
  5. 这对traits类std::is_move_assignable有何影响?

c++ language-lawyer move-semantics c++11

14
推荐指数
1
解决办法
439
查看次数

移动分配是通过destruct + move构造安全吗?

这是使用移动构造函数为大多数类定义移动赋值的一种非常简单的方法:

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

8
推荐指数
1
解决办法
567
查看次数