我有以下代码:
#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(及以上版本)都可以编译此代码。在我看来,这应该也没问题。然而,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和GCC 5.1中运行。
{}
就能让它工作了。确实非常奇怪... - user7881131ClassificationMap(std::initializer_list<std::pair<const Classification, int>> content = {})
中删除= {}
可以使其在 g++ 中编译。 - NathanOliverfoo(std::initializer_list<std::pair<const Classification, int>>{{Classification::Unspecified, 42}});
看来gcc无法正确地推断出std :: initializer_list
的类型。Clang则能够完美处理。 - Adam Hunyadi-std=c++11
? - Brian A. Henningstd::pair
(因为没有这样的构造函数),而ClassificationMap
构造函数需要传入std::pair
。额外的花括号“解决”了问题,因为它可以直接对整个对象进行列表初始化。 - Damon