GCC拒绝列表初始化参数

Rei*_*ica 16 c++ gcc initializer-list c++11 list-initialization

我有以下代码:

#include <initializer_list>
#include <utility>

enum class Classification
{
  Unspecified,
  Primary,
  Secondary
};

class ClassificationMap
{
public:
  ClassificationMap(std::initializer_list<std::pair<const Classification, int>> content = {});
};

void foo(ClassificationMap) {}

int main()
{
    foo({{Classification::Unspecified, 42}});
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio 2013和2017以及Clang 3.4.1(及以上版本)都编译好了代码.从我的POV来看,它也应该没问题.但是,GCC 5.1拒绝编译它,并出现以下错误:

<source>: In function 'int main()':
<source>:22:44: error: could not convert '{{Unspecified, 42}}' from '<brace-enclosed initializer list>' to 'ClassificationMap'
     foo({{Classification::Unspecified, 42}});
Run Code Online (Sandbox Code Playgroud)

[实例]

(我将正确的标准flag(-std=c++11)传递给GCC和Clang).

我的代码中是否存在问题,或者这实际上是GCC错误?


补充信息:在我的实际代码中,初始化列表用于初始化类的无序映射成员ClassificationMap(这就是它的类型就是它的原因).我需要代码在VS2013和GCC 5.1中工作

Mar*_*k R 1

这是解决该问题的一个很好的解决方法(放弃默认值):

class ClassificationMap
{
public:
    ClassificationMap(std::initializer_list<std::pair<const Classification, int>> content);
    ClassificationMap() : ClassificationMap({}) {}

};
Run Code Online (Sandbox Code Playgroud)

您将获得您想要的确切行为,并且它可以在任何地方编译。

https://godbolt.org/g/WUuMzP