gpt4 book ai didi

c++ - GCC 拒绝参数的列表初始化

转载 作者:IT老高 更新时间:2023-10-28 22:22:35 27 4
gpt4 key购买 nike

我有以下代码:

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

[Live example]

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

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


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

最佳答案

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

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

};

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

https://godbolt.org/g/WUuMzP

关于c++ - GCC 拒绝参数的列表初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43805253/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com