C++ 使用默认构造值初始化std::map

C++ 使用默认构造值初始化std::map,c++,initializer-list,default-constructor,C++,Initializer List,Default Constructor,如果我有一个std::map,它很好而且很容易初始化: std::map<int, char> myMap = { { 1, 'a' }, { 2, 'b' } }; std::map myMap= { {1,'a'}, {2,'b'} }; 如果我的值类型有一个默认构造函数,我可以这样初始化它: struct Foo { char x; }; std::map<int, Foo> myMap = { { 1, Foo() }, { 2, Fo

如果我有一个
std::map
,它很好而且很容易初始化:

std::map<int, char> myMap = 
{
  { 1, 'a' },
  { 2, 'b' }
};
std::map myMap=
{
{1,'a'},
{2,'b'}
};
如果我的值类型有一个默认构造函数,我可以这样初始化它:

struct Foo
{
  char x;
};

std::map<int, Foo> myMap =
{
  { 1, Foo() },
  { 2, Foo() }
};
structfoo
{
字符x;
};
std::map myMap=
{
{1,Foo()},
{2,Foo()}
};
但是,假设我的值类型有一个默认构造函数,但类型不方便:

std::map<int, yourNamespace::subLibrary::moreLevels::justBecause::Thing> myMap = 
{
  // What goes here? I don't want to type
  // yourNamespace::subLibrary::moreLevels::justBecause::Thing again.
};
std::map myMap=
{
//这是什么?我不想打字
//yourNamespace::subLibrary::moreLevels::justBecause::Thing。
};
除了使用声明使值类型更加键盘友好之外,是否有一些方法可以使用一组键初始化
映射
,所有键都使用默认构造的
yourNamespace::subLibrary::moreLevels::justBecause::Thing
?如何表示希望映射的值是其类型的默认构造值?

您可以使用来解决此问题

struct Foo
{
    char x;
};

std::map<int, Foo> myMap =
{
    { 1, {} },
    { 2, {} }
};
structfoo
{
字符x;
};
std::map myMap=
{
{ 1, {} },
{ 2, {} }
};

您可以创建一个函数,返回“yourNamespace::subLibrary::moreLevels::justBecause::Thing”的实例

我想我可以,我试过了,但没有成功。。。这就是我来这里的原因。进一步的prodding表明它通常是有效的,但如果值类型不是可复制构造的,则不会。你知道为什么吗?@Chowlett关于你的后续问题,我会把你推荐给我。啊。这就可以解释了。因此,我是否完全满足于以这种方式初始化?我注意到,甚至
myMap={{1,Foo()}失败,原因可能与此完全相同。@Chowlett如果没有复制构造函数,则初始化列表将很难使用。考虑一个关于如何解决这个问题的单独问题。包括到目前为止您已经尝试过的内容。其他信息:自
C++11