为什么 unordered_map 的 piecewise_construct 参数需要默认构造函数?
Why does unordered_map's emplace with piecewise_construct argument needs default constructor?
我有一个 unordered_map
存储 <string, A>
对。我想用这个片段放置对:
map.emplace(std::piecewise_construct,
std::forward_as_tuple(name),
std::forward_as_tuple(constructorArg1, constructorArg1, constructorArg1));
但是,如果我的 A
class 没有默认构造函数,则它无法编译并出现此错误:
'A::A': no appropriate default constructor available
C:\Program Files (x86)\Microsoft Visual Studio
14.0\VC\include\tuple 1180
为什么它需要一个默认构造函数,我怎样才能避免使用它?
std::unordered_map
需要默认构造函数是因为 operator[]
。如果 map
中不存在 key
,map[key]
将使用默认构造函数构造新元素。
您完全可以在没有默认构造函数的情况下使用 map。例如。以下程序将编译无错误。
struct A {
int x;
A(int x) : x(x) {}
};
...
std::unordered_map<int, A> b;
b.emplace(std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2));
b.at(1).x = 2;
我有一个 unordered_map
存储 <string, A>
对。我想用这个片段放置对:
map.emplace(std::piecewise_construct,
std::forward_as_tuple(name),
std::forward_as_tuple(constructorArg1, constructorArg1, constructorArg1));
但是,如果我的 A
class 没有默认构造函数,则它无法编译并出现此错误:
'A::A': no appropriate default constructor available
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\tuple 1180
为什么它需要一个默认构造函数,我怎样才能避免使用它?
std::unordered_map
需要默认构造函数是因为 operator[]
。如果 map
中不存在 key
,map[key]
将使用默认构造函数构造新元素。
您完全可以在没有默认构造函数的情况下使用 map。例如。以下程序将编译无错误。
struct A {
int x;
A(int x) : x(x) {}
};
...
std::unordered_map<int, A> b;
b.emplace(std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2));
b.at(1).x = 2;