【发布时间】:2018-02-03 10:19:43
【问题描述】:
考虑以下代码:
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
A(int) { cout << "int" << endl; }
A(A&&) { cout << "move" << endl; }
A(const A&) { cout << "copy" << endl; }
};
int main()
{
vector<A> v
{
A(10), A(20), A(30)
};
_getch();
return 0;
}
输出是:
int
int
int
copy
copy
copy
A(10)、A(20) 和 A(30) 是临时的,对吧?
那么为什么要调用复制构造函数呢?不应该调用移动构造函数吗?
改为传递move(A(10))、move(A(20))、move(A(30)),输出为:
int
move
int
move
int
move
copy
copy
copy
在这种情况下,复制或移动构造函数被调用。
发生了什么事?
【问题讨论】:
-
您不能从
initializer_list元素中移动。第二个示例中的附加move禁止复制省略,因此您可以在副本顶部进行额外移动。 -
在
std::vector中采用std::initializer_list的构造函数中,这些元素不再是右值。 -
此外,如果您要调用
v.push_back()几次,直到向量超出其容量并不得不重新分配,您将得到一堆副本而不是移动。为防止这种情况发生,您需要标记您的移动构造函数noexcept。 -
@ArneVogel:我被撕裂了。一方面,该问题的“更新”与这个问题非常相似。另一方面,这些答案非常不完整。
标签: c++ c++11 copy-constructor move-semantics move-constructor