C++ C++;:为什么没有调用move构造函数?
我正在试验以下代码:C++ C++;:为什么没有调用move构造函数?,c++,move-constructor,C++,Move Constructor,我正在试验以下代码: #include <iostream> #include <utility> using namespace std; class A { int data; public: A(): data{0} { } A(const A& other) { print(other); } A(A&& other) { print(other)
#include <iostream>
#include <utility>
using namespace std;
class A
{
int data;
public:
A(): data{0}
{
}
A(const A& other)
{
print(other);
}
A(A&& other)
{
print(other);
}
void print(const A& other) const
{
cout << "In print 1" << endl;
}
void print(const A&& other) const
{
cout << "In print 2" << endl;
}
};
int main() {
A a0;
A a1(a0);
A a2(A());
return 0;
}
然而,问题是:
显然,没有调用move构造函数。为什么会这样?在构建a2
的过程中,什么被称为它的位置?因为a2(A())代码>实际上是函数声明,而不是对象声明。见此:
如果要查看移动构造函数,请执行以下操作:
A a2((std::move(A())));
因为a2(A())代码>实际上是函数声明,而不是对象声明。见此:
如果要查看移动构造函数,请执行以下操作:
A a2((std::move(A())));
a3(std::move(a0))如果你在C++17中,那么你不会在a2(A{})中观察到move-(或copy-)结构代码>或a2=A()代码>-所有这些都将使用A
的默认构造函数初始化a2
。A a3(std::move(a0))如果你在C++17中,那么你就不会在A a2(A{})中观察到move-(或copy-)构造代码>或a2=A()代码>-所有这些都将使用A
的默认构造函数初始化a2
。没有创建、复制、移动或分配临时文件。或a2(A{})代码>(如果未省略移动构造函数)。请注意,这两种方法都不是a2=A()
nora2(A{})
(或者类似于aa2=A(A(A());
的东西调用C++17中的移动构造函数。临时变量永远不会被具体化。请参阅。或者aa2(A{});
(如果没有省略移动构造函数)。请注意aa2=A();
或者aa2(A{});
(或者类似aa2=A(A(A())的东西);
在C++17中调用移动构造函数。临时值永远不会具体化。请参阅。
A a2((std::move(A())));