【发布时间】:2015-02-24 10:09:40
【问题描述】:
我可以发誓我不记得以前看过这个,而且我很难相信自己的眼睛:
非聚合类的隐式定义的默认构造函数是否初始化其成员?
在 Visual C++ 中,当我运行这个看似无辜的代码时...
#include <string>
struct S { int a; std::string b; };
int main() { return S().a; }
...令我惊讶的是,它返回一个非零值!但如果我删除字段b,则返回零。
我已经在我能接触到的所有 VC++ 版本上尝试过这个,而且似乎在所有版本上都可以做到这一点。
但是当我在 Clang 和 GCC 上尝试时,无论我在 C++98 模式还是 C++11 模式下尝试,值都会初始化为零。
正确的行为是什么?不保证为零吗?
【问题讨论】:
-
具体是哪个版本的VC++?目前还没有完全支持 C++11 的版本,所以这真的很重要。
-
固定在Visual Studio 2015 Preview。这是将 Windows 项目转移到它的另一个好理由(以及
constexpr以及 android clang 和 gdb 集成)
标签: c++ visual-c++ constructor initialization default-constructor