理解本例中的move构造函数行为
understand the move constructor behavior in this example
我正在学习c++ 11中的移动语义。我写了一个小程序来测试移动语义的行为。但是它的表现不像我期望的那样,有人能解释一下为什么吗?
#include<iostream>
using namespace std;
class Vector
{
public:
Vector()
{
cout << "empty Ctor"<<endl;
array = new int[10];
size = 10;
}
Vector(int n)
{
array = new int[n];
size = n;
for (int i=0; i<size; ++i)
array[i] = i;
cout << "Ctor"<<endl;
}
Vector(const Vector& v):size(v.size)
{
array = new int[size];
for (int i=0; i<size; ++i)
array[i] = v.array[i];
cout << "copy"<<endl;
}
Vector(Vector&& v):size(v.size)
{
array = v.array;
v.array = nullptr;
cout << "move"<<endl;
}
~Vector()
{
delete array;
}
private:
int* array;
int size;
};
int main() {
Vector v(10); //print Ctor. (as expected)
Vector v1(std::move(v)); //print move. (as expected)
Vector v2(*(new Vector(2))); //print Ctor, copy. (I expect Ctor, move)
Vector v3(Vector(2)); //print only Ctor. (I expect Ctor, move)
}
那么,为什么打印不是我所期望的。因为我认为传递给v2和v3的值都是右值。对于v3,为什么它只打印tor而不打印move或copy
Vector v2(*(new Vector(2)));
new Vector(2)
是一个右值,但是对它解引用产生一个左值,因此是复制而不是移动。
Vector v3(Vector(2));
由于临时Vector
是不必要的,编译器将省略该副本。您的编译器可能有一个禁用复制省略的标志,以便您可以看到额外的移动,例如GCC和Clang中的-fno-elide-constructors
。
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- std::映射,只有move构造函数可用
- 为什么我的代码中没有调用move构造函数
- std::转换move构造函数的模板专业化的变体
- 如何调用move构造函数
- 我可以将 std::move 与不提供 move 构造函数的类一起使用吗?
- 为什么noexcept move构造函数在向量重新分配期间没有被调用
- 为什么在声明析构函数时必须声明 copy & move 构造函数?
- 如何在我自己的类 Vector 中使用 Move 构造函数而不是 Move 赋值运算符
- GoogleTest Move 构造函数覆盖率
- C - 构造函数,复制构造函数,MOVE构造函数,驱动器
- 如何在基类中调用 "move" '&&' 构造函数?在C++
- 如果我有一个向量(或类似的东西)成员变量,那么move构造函数看起来怎么样
- std::vector的move构造函数是否调用项的move构造器
- 为什么我们需要在move构造函数中将右值引用设置为null
- move构造函数在C++中调用了两次吗
- 实现move构造函数如何影响返回值优化
- 不能默认使用Move构造函数
- C++合成的move构造函数如何受到volatile和虚拟成员的影响