为什么编译器在调用 move 后选择复制 ctor
Why does the compiler choose the copy ctor after calling move
对于下面的代码,我知道因为我实现了一个拷贝构造函数,默认的move被编译器阻止了,我不明白的是为什么编译器选择了拷贝构造函数,而不是报错?
如果不存在右值引用函数,右值引用可以作为引用函数的参数吗?
如果不是,这里会发生什么?
#include <iostream>
using namespace std;
class A{
public:
A(){printf("constructor\n");}
A(const A& a){printf("copy constructor");}
};
int main()
{
A a;
A b = std::move(a);
return 1;
}
输出为:
constructor
copy constructor
谢谢
std::move
会将您的命名值转换为右值表达式,仅此而已。
而且,就像任何其他右值一样,如果它不能移动,它将被复制。
T
类型的右值可以绑定到 const T&
就好了。
原因是右值表达式可以绑定到const
左值引用.[=13的函数参数=]
另请注意,const
右值表达式 不能绑定到右值引用:
class A{
public:
A(){printf("constructor\n");}
A(const A& a){printf("copy constructor");}
A(A&&) = default; // <-- has move ctor
};
int main()
{
const A a; // <-- const!
A b = std::move(a); // <-- copy not move!!!
return 1;
}
上面的代码仍然调用复制构造函数,即使有一个移动构造函数。
对于下面的代码,我知道因为我实现了一个拷贝构造函数,默认的move被编译器阻止了,我不明白的是为什么编译器选择了拷贝构造函数,而不是报错?
如果不存在右值引用函数,右值引用可以作为引用函数的参数吗?
如果不是,这里会发生什么?
#include <iostream>
using namespace std;
class A{
public:
A(){printf("constructor\n");}
A(const A& a){printf("copy constructor");}
};
int main()
{
A a;
A b = std::move(a);
return 1;
}
输出为:
constructor
copy constructor
谢谢
std::move
会将您的命名值转换为右值表达式,仅此而已。
而且,就像任何其他右值一样,如果它不能移动,它将被复制。
T
类型的右值可以绑定到 const T&
就好了。
原因是右值表达式可以绑定到const
左值引用.[=13的函数参数=]
另请注意,const
右值表达式 不能绑定到右值引用:
class A{
public:
A(){printf("constructor\n");}
A(const A& a){printf("copy constructor");}
A(A&&) = default; // <-- has move ctor
};
int main()
{
const A a; // <-- const!
A b = std::move(a); // <-- copy not move!!!
return 1;
}
上面的代码仍然调用复制构造函数,即使有一个移动构造函数。