У меня есть следующий код и его вывод напечатан ниже. Я не могу понять, почему один набор фигурной инициализации приводит к вызову конструктора перемещения, а другой - к конструктору копирования. Я несколько сузил его до прямой инициализации списков по сравнению с инициализацией списков копий для 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