首页 > 解决方案 > 为什么带有默认参数 std::initializer_list 的 ctor 不可用(VS2019)?

问题描述

我不太明白为什么这段代码不能在 Visual Studio 2019 (16.8.3) 上编译:

#include <initializer_list>

struct Foo
{
    Foo(std::initializer_list<int> = {});
};

int main()
{
    Foo f;
}

Foo::Foo(std::initializer_list<int>) {}

它给了我这个错误:

C2512:“Foo”:没有合适的默认构造函数可用

这是编译器错误还是我在这里遗漏了什么?请注意,我已经检查过了,这确实在 GCC 10.1 上编译

如果将构造函数的前向声明更改为立即定义,则代码编译不会出错:

#include <initializer_list>

struct Foo
{
    Foo(std::initializer_list<int> = {}) {}
};

int main()
{
    Foo f;
}

标签: c++visual-studio-2019

解决方案


这里有一个编译器错误。

它不应该仅仅因为构造函数的定义在同一个翻译单元中不可用而导致编译失败(在另一个翻译单元中提供它,或者甚至在下面提供它main,都不允许程序构建)。

如果你换掉它std::initializer_listint一切都会按预期工作。

我已将此问题报告给 Microsoft。(可用时添加链接)


推荐阅读