C++:右值引用构造函数和复制省略
C++: rvalue reference constructor and copy-elision
我正在尝试理解右值引用构造函数和赋值运算符。 我创建了以下源代码,它应该调用rvalue 引用构造函数,但它没有发生。 我怀疑是复制消除优化是原因。 有谁知道这是不是原因? 另外,如果复制省略是原因,那么代码中右值引用的意义何在?
#include <iostream>
#include <vector>
using namespace std;
class X {
public:
X() : v{new vector<int>(0)} { }
X(const X&);
X(X&&);
X& operator=(const X& rhs);
X& operator=(X&& rhs);
private:
vector<int> *v;
};
X::X(const X& a)
{
cout << "copy constructor" << endl;
for (auto p : *(a.v))
v->push_back(p);
}
X::X(X&& a) : v{a.v}
{
cout << "rval ref constructor" << endl;
a.v = nullptr;
}
X& X::operator=(const X& rhs)
{
cout << "assignment operator" << endl;
delete v;
v = new vector<int>();
for (auto p : *(rhs.v))
v->push_back(p);
return *this;
}
X& X::operator=(X&& rhs)
{
cout << "rval ref assignment op" << endl;
swap(v, rhs.v);
return *this;
}
X f0()
{
return X(); // copy-elision no move called
// return move(X());
}
int main(int argc, char *argv[])
{
X x1(f0());
return 0;
}
将以下内容添加到 main((:
X x2(std::move(x1));
这手动指示对象 X1 可以从中移动以解决复制省略问题。 并不总是调用 copy-elision,因此在某些情况下可能需要 rvalue 引用构造函数和赋值运算符。
相关文章:
- 是否可以避免在以下代码中复制/移动构造函数的需要?
- 默认复制/移动构造函数时 GDB 中的奇怪行为
- 意外缺少隐式声明的复制/移动构造函数
- C++复制/移动构造函数和赋值运算符
- 为什么编译器在有模板构造函数时生成复制/移动构造函数
- 从C++中的基类继承复制/移动构造函数作为构造函数
- C :将一个对象复制到构造函数中的另一个对象
- 参数化的构造函数不是复制的构造函数
- 我们是否应该从派生类调用基类移动复制/分配构造函数
- 向量<shared_ptr<X>>复制- 调用 X 构造函数?
- 自动变量初始化和复制/移动构造函数
- 复制/移动省略与显式删除的复制/移动构造函数
- Clang和GCC与MSVC和ICC的比较:如果复制/移动省略也适用,那么在复制/移动构造函数中是否需要静态断言
- 提升interprocess_mutex复制/移动构造函数
- 为简单结构定义哪个复制/移动构造函数/运算符
- C++中函数返回的值是右值吗?无法使用复制/移动构造函数初始化实例
- 我们可以通过函数中的值返回具有已删除/私有复制/移动构造函数的对象吗
- 为什么代码需要有一个可访问的复制/移动构造函数,即使允许发生复制-省略
- 如何将cstring复制到构造函数初始化列表中的成员变量
- std::is_copy/move_constructible失败,即使复制/移动构造函数是默认的