【发布时间】:2015-02-22 22:11:46
【问题描述】:
为什么
struct wrapper
{
explicit wrapper(void *);
wrapper() = default;
int v;
};
int main() { return wrapper().v; } // You should run this in Debug mode
返回0xCCCCCCCC,而
struct wrapper { wrapper() = default; int v; };
int main() { return wrapper().v; }
和
struct wrapper { int v; };
int main() { return wrapper().v; }
都返回0?
【问题讨论】:
-
当你添加 non-=default 构造函数时,类型不再是聚合。我敢肯定这是在发挥作用,但不知道如何。我怀疑在任何一种情况下都不能保证它为 0。
-
@RyanHaining:你确定吗?如果是这样,那似乎很奇怪,因为这意味着您唯一可以使用
= default的时候是没有其他构造函数存在时,这似乎毫无意义... -
=default将返回默认构造函数,但v在这两种情况下都未初始化。使用 gcc 即使在第一种情况下我也会得到 0,但这一切都是偶然的。 -
@RyanHaining:如果您将构造函数显式声明为
wrapper() { }(即避免初始化v),在GCC 的第一种情况下您仍然会得到零吗? (不要忘记在没有优化的调试模式下进行这两个实验。) -
在这种情况下,我不会,不,我也获得了巨大的价值。我认为我实际上对 0 保证有误。我在看atm的规则
标签: c++ visual-c++ constructor default-constructor visual-c++-2013