GCC отказывается от инициализации списка параметров

У меня есть следующий код:

#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}});
}

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}});

[Живой пример]

(Я передаю правильный стандартный флаг (-std=c++11) как для GCC, так и для Clang).

Есть ли проблема в моем коде, или это на самом деле ошибка GCC?


Дополнительная информация: в моем реальном коде список инициализаторов используется для инициализации неупорядоченного члена карты класса ClassificationMap (поэтому его тип является тем, чем он является). Мне нужен код для работы в VS2013 и GCC 5.1

Ответы

Ответ 1

Вот хороший способ устранения проблемы (отказаться от значения по умолчанию):

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

};

У вас будет точное поведение, которое вы хотите, и оно компилируется повсюду.

https://godbolt.org/g/WUuMzP