匿名结构中的 Brace-or-equal-initializers 在 VS2013 上不起作用
Brace-or-equal-initializers in anonymous struct does not work on VS2013
结构中匿名结构中的大括号或相等初始化器不会对 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 制造的错误,我必须为结构创建默认构造函数?这太荒谬了。
I have to make default constructors for the structures because of a bug MS made? this is absurd.
是的,不是的,这并不荒谬。
编译器也是程序,并且往往有错误 - 有些错误比其他错误更多。
如果您对工具别无选择,就必须在工具的限制下工作,无论它在理论上听起来多么荒谬。
在 Visual C++ 2015 RTM 中,非静态数据成员初始值设定项在嵌套匿名结构中被静默忽略是 confirmed bug in Visual C++ 2013, fixed。
结构中匿名结构中的大括号或相等初始化器不会对 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 制造的错误,我必须为结构创建默认构造函数?这太荒谬了。
I have to make default constructors for the structures because of a bug MS made? this is absurd.
是的,不是的,这并不荒谬。
编译器也是程序,并且往往有错误 - 有些错误比其他错误更多。
如果您对工具别无选择,就必须在工具的限制下工作,无论它在理论上听起来多么荒谬。
在 Visual C++ 2015 RTM 中,非静态数据成员初始值设定项在嵌套匿名结构中被静默忽略是 confirmed bug in Visual C++ 2013, fixed。