【发布时间】:2020-07-23 20:42:31
【问题描述】:
我有以下代码及其输出打印在下面。我似乎无法理解为什么一组大括号初始化导致调用移动构造函数,而另一组导致调用复制构造函数。我根据https://en.cppreference.com/w/cpp/language/list_initialization 将其范围缩小到直接列表初始化与复制列表初始化 我只是无法弄清楚我的代码属于哪种情况。提前致谢。
#include <cstdint>
#include <iostream>
using namespace std;
struct Foo {
Foo() {
cout << "create foo\n";
}
~Foo() {
cout << "delete foo\n";
}
Foo(const Foo& f) {
cout << "copy foo\n";
}
Foo(Foo&& f) noexcept {
cout << "move foo\n";
}
Foo& operator=(const Foo& f) = delete;
Foo& operator=(Foo&& f) = delete;
};
int32_t main() {
pair<uint32_t, Foo> f1{0, Foo{}}; // Calls move ctor
cout << "------------------------\n";
pair<uint32_t, Foo> f2{0, {}}; // Calls copy ctor
cout << "------------------------\n";
return 0;
}
这会导致
create foo
move foo
delete foo
------------------------
create foo
copy foo
delete foo
------------------------
delete foo
delete foo
【问题讨论】:
标签: c++ templates initialization move-semantics std-pair