Visual C++与gcc和clang初始化不一致

3

1
看起来确实是vc++编译器中的一个编译器错误。 - Jabberwocky
1
我似乎记得C++17即将对大括号初始化器中仅有一个元素做出更改。如果您将0更改为13,会发生什么? - Cheers and hth. - Alf
@Cheersandhth.-Alf 例如:std::vector<int> v{ 11,22 };会产生相同的问题。 - Jabberwocky
2个回答

3
在阅读标准(C++11 n3485)时,12.6.2/9规定:

如果一个非静态数据成员同时具有brace-or-equal-initializermem-initializer,则执行mem-initializer指定的初始化,而忽略非静态数据成员的brace-or-equal-initializer

因此问题变为默认构造函数是否包含mem-initializer

12.1/6节规定:

隐式定义的默认构造函数执行的是该类用户自定义默认构造函数在没有ctor-initializer(12.6.2)和空compound-statement的情况下执行的类初始化集合。

这意味着隐式生成的(默认)构造函数没有mem-initializer,应该使用类中的初始化程序(上述引用中的brace-or-equal-initializer)。
MSVC在此处是错误的(这并不奇怪)。

1
这不是一个答案,而是需要代码的评论。
以下内容更清楚地说明了编译器之间的差异,我认为:
#include <iostream>
#include <vector>

struct S
{
    S() = default;

    std::vector<int> v = std::vector<int>(13);
};

int main()
{
    std::vector<S> s{{}};
    std::cout << s.front().v.size() << std::endl;
}

在这里,g++ MinGW 5.1.0 报告了13个项目,而 MSVC 2015 update 2 报告了0个项目。也就是说,g++ 使用类中指定的初始化程序,而 MSVC 使用在 s 的声明中指定的初始化程序。对我来说,这看起来像是 g++ 的问题。但我不确定:唯一确定的是两者都不能正确。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接