我有以下代码:
#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&amp; 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}});
(我正在向GCC和Clang传递正确的标准标志(-std=c++11
)。
我的代码中是否存在问题,或者这实际上是GCC错误?
补充信息:在我的真实代码中,初始化列表用于初始化ClassificationMap
类的无序地图成员(这就是为什么它的类型是它的原因)。我需要代码才能在VS2013&amp; GCC 5.1
答案 0 :(得分:1)
以下是该问题的一个很好的解决方法(放弃默认值):
class ClassificationMap
{
public:
ClassificationMap(std::initializer_list<std::pair<const Classification, int>> content);
ClassificationMap() : ClassificationMap({}) {}
};
您将拥有自己想要的确切行为,并且可以随处编译。