初始化初始化列表中的unordered_map

时间:2017-06-19 23:21:35

标签: c++ c++11 initialization c++14 unordered-map

我试图找到一个可能是一个非常微不足道的问题的解决方案。我想在类初始化列表中初始化我的const unordered_map。但是,我还没有找到编译器(GCC 6.2.0)将接受的语法。代码链接为here

#include <unordered_map>

class test {
 public:
    test()
      : map_({23, 1345}, {43, -8745}) {}

 private:
   const std::unordered_map<long, long> map_;
 };

错误:

main.cpp: In constructor 'test::test()':
main.cpp:6:36: error: no matching function for call to 'std::unordered_map<long int, long int>::unordered_map(<brace-enclosed initializer list>, <brace-enclosed initializer list>)'
  : map_({23, 1345}, {43, -8745}) {}
                                ^

复制常量是否不允许在初始化列表中初始化?或者语法必须不同?

2 个答案:

答案 0 :(得分:10)

使用大括号代替括号

{% set width_list = [star_4_percent/star_1, star_4_percent/star_2, star_4_percent/star_3, star_4_percent/star4, star_4_percent/star_5] %}

答案 1 :(得分:2)

使用花括号代替括号,因为如果使用括号,它将调用最匹配您的参数的构造函数,而不是参数类型为initializer_list的重载构造函数。

使用括号和花括号具有相同的作用,直到有一个以initializer_list类型作为参数的重载构造函数为止。然后,当您使用花括号时,编译器将向后弯曲以尝试调用该重载的构造函数。

例如:

Foo( 3 ) is calling Foo( int x ) constructor;
Foo{ 3 } is calling Foo( initializer_list<int> x ) constructor;

but if there's no Foo( initializer_list<int> x ) constructor

then Foo( 3 ) and Foo{ 3 } are both calling Foo( int x ) constructor.