未调用 C++ 移动构造函数
C++ move constructor not called
在以下(借用的)示例中,在我的环境中从未调用移动构造函数:
#include <iostream>
class MyClass {
public:
MyClass()
{
std::cout << "default constructor\n";
}
MyClass(MyClass& a)
{
std::cout << "copy constructor\n";
}
MyClass(MyClass&& b)
{
std::cout << "move constructor\n";
}
};
void test(MyClass&& temp)
{
MyClass a(MyClass{}); // calls MOVE constructor as expected
MyClass b(temp); // calls COPY constructor...
}
int main()
{
test(MyClass{});
return 0;
}
我的输出是:
默认构造函数
默认构造函数
复制构造函数
我使用 XCode 版本 9.1,不应该在右值引用上调用移动构造函数吗?我在这里错过了什么?
约翰.
What am I missing here?
关键是所有有名字的东西都是左值。
这意味着命名右值引用本身是左值并且temp
来自:
void test(MyClass&& temp)
也是左值。所以移动构造函数没有被调用。
如果要调用移动构造函数,请使用std::move
:
void test(MyClass&& temp)
{
// ...
MyClass b(std::move(temp)); // use std::move here
}
顺便说一句,
MyClass(MyClass& a)
{
std::cout << "copy constructor\n";
}
不是复制构造函数,因为复制构造函数的形式为:
MyClass(const MyClass& a) { ... }
在以下(借用的)示例中,在我的环境中从未调用移动构造函数:
#include <iostream>
class MyClass {
public:
MyClass()
{
std::cout << "default constructor\n";
}
MyClass(MyClass& a)
{
std::cout << "copy constructor\n";
}
MyClass(MyClass&& b)
{
std::cout << "move constructor\n";
}
};
void test(MyClass&& temp)
{
MyClass a(MyClass{}); // calls MOVE constructor as expected
MyClass b(temp); // calls COPY constructor...
}
int main()
{
test(MyClass{});
return 0;
}
我的输出是: 默认构造函数 默认构造函数 复制构造函数
我使用 XCode 版本 9.1,不应该在右值引用上调用移动构造函数吗?我在这里错过了什么?
约翰.
What am I missing here?
关键是所有有名字的东西都是左值。
这意味着命名右值引用本身是左值并且temp
来自:
void test(MyClass&& temp)
也是左值。所以移动构造函数没有被调用。
如果要调用移动构造函数,请使用std::move
:
void test(MyClass&& temp)
{
// ...
MyClass b(std::move(temp)); // use std::move here
}
顺便说一句,
MyClass(MyClass& a)
{
std::cout << "copy constructor\n";
}
不是复制构造函数,因为复制构造函数的形式为:
MyClass(const MyClass& a) { ... }