匿名结构中的Brace-or-equal-initializers在VS2013上不起作用

时间:2017-02-27 04:18:04

标签: c++11 member-initialization visual-c++-2013 anonymous-struct

结构中匿名结构中的括号或等于初始化器不会对VS2013生成的输出进行处理。代码是:

#include <iostream>
#include <cstdint>


struct S
{
    struct
    {
        uint64_t val = 0;
    }anon;
};

int main()
{
    S s;
    S *a = new S;

    std::cout << s.anon.val << std::endl;
    std::cout << a->anon.val << std::endl;

    return 0;
}

在Linux上使用此命令进行编译:

g++ -std=c++11 def-init-anon-atruct.cpp -o def-init-anon-atruct

(添加优化标志不会影响结果)

预期结果:

0
0

怪异。使用VS2013运行它会产生垃圾值。在实施C ++ 11标准方面,谁在这方面是对的?我非常怀疑这是海湾合作委员会的错。

是否与某些无用的VS编译器选项有关? Windows扩展?由于MS制造的错误,我必须为结构制作默认构造函数?这太荒谬了。

2 个答案:

答案 0 :(得分:6)

  

由于MS制造的错误,我必须为结构制作默认构造函数?这太荒谬了。

是的,不,这不荒谬。

编译器也是程序,并且往往会有错误 - 比其他程序更多。

如果您对该工具没有选择权,那么无论理论上听起来多么荒谬,您都必须使用该工具的局限性。

答案 1 :(得分:2)

在嵌套匿名结构中以静默方式忽略的非静态数据成员初始化者是Visual C ++ 2013中的confirmed bug,Visual C ++ 2015 RTM中的fixed