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