繁体   English   中英

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

[英]Visual C++ initialization inconsistence with gcc and clang

下面的代码打印0vc ++ 编译打印1g ++clang ++编译

#include <iostream>
#include <vector>

struct S
{
    S() = default;

    std::vector<int> v{0};        
};

int main()
{
    std::vector<S> s{{}};

    std::cout << s.front().v.size() << std::endl;
}

这是vc ++中的错误吗?

如果提供了用户定义的构造函数( S() {};而不是S() = default;vc ++也开始打印1

在阅读标准(C ++ 11 n3485)时, 12.6.2/9指出:

如果给定的非静态数据成员同时具有brace-or-equal-initializermem-initializer ,则执行mem-initializer指定mem-initializer ,并且非静态数据成员的brace-or-equal-initializer值为忽略。

所以问题就变成了default ,即隐式定义的构造函数是否包含mem-initializer

12.1/6节规定:

隐式定义的默认构造函数执行该类的初始化集,该初始化集将由该用户编写的默认构造函数执行,该类没有ctor-initializer (12.6.2)和空compound-statement

这意味着隐式生成的(默认)构造函数没有mem-initializer并且确实应该使用类内初始化程序(上面引用中的brace-or-equal-initializer )。

MSVC在这里是错误的(真的没有惊喜)。

这不是答案,而是需要代码的评论。

下面更清楚地说明了编译器的差异,我认为:

#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更新2报告0项。

即g ++使用类中指定的初始化程序,而MSVC使用s声明中指定的初始化程序。 对我来说,这看起来像g ++的问题。 但我不确定:唯一确定的是两者都不对。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM