临时对象混淆

时间:2010-12-07 16:09:12

标签: c++ temporary

查看此代码段

struct S{ int i; int j;};

int main()
{
   assert(S().i ==  S().j) // is it guaranteed ?
}

为什么?

3 个答案:

答案 0 :(得分:10)

  

有保证吗?

是的,这是有保证的。 S().iS().j的值为0()隐含value initialization.(这意味着ij将被初始化为零,因为S是没有用户定义的默认构造函数的类)

答案 1 :(得分:0)

来自C ++标准ISO / IEC 14882:2003(E)第3.6.2点

  

具有静态存储持续时间(3.7.1)的对象应在任何其他初始化之前进行零初始化(8.5)   发生了。

所以这是有效的,因为两个变量都是零初始化的。

答案 2 :(得分:-1)

技术上,是的。它们将被初始化为0 (至少在大多数编译器的非调试版本下.Visual Studio的编译器通常会将未初始化的变量初始化为调试版本中的特定模式)

但是,如果您参与代码审核,如果因为未明确初始化变量而大吼大叫,请不要感到惊讶。