匿名结构体中的花括号等于初始化在VS2013上无法工作

9

在一个结构体内部的匿名结构体中使用大括号等于初始化器不能在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标准方面,谁是正确的?我非常怀疑这是GCC的问题。

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


1
https://dev59.com/M3NA5IYBdhLWcg3wKacx - Ben
我也非常怀疑这是gcc的错。 - Sam Varshavchik
支持已结束。无需提交错误报告。https://support.microsoft.com/zh-cn/help/14086/products-reaching-end-of-support-in-the-second-half-of-2016 - user2694310
Visual Studio 2015 更新3也能得到预期结果。 - HDJEMAI
给你的老板提供一个换新编译器的好理由;-) - zett42
显示剩余5条评论
2个回答

6

因为微软出现了一个bug,我必须为结构体创建默认构造函数?这太荒谬了。

是的,但不是荒谬的。

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

如果你没有选择工具的权利,你必须在工具的限制下工作,无论在理论上听起来多么荒谬。


1

在嵌套的匿名结构中,非静态数据成员初始化器被默默忽略是Visual C++ 2013中确认的错误,在Visual C++ 2015 RTM中已修复


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