C ++ 11整数初始化

时间:2018-05-01 06:45:16

标签: c++ c++11 language-lawyer

以下代码是否符合 C ++标准观点

或者在我的示例中输出0的任何情况都会在某些情况下失败?

struct Foo {
  Foo() : k(), t{} {}
  uint64_t i; //Uninitalized
  uint64_t k;
  uint64_t t;
};

int main(int argc, char ** argv) {

  uint64_t i;
  std::cout << i << std::endl; //Outputs garbage
  uint64_t k = uint64_t();
  std::cout << k << std::endl; //Outputs 0
  uint64_t t = {};
  std::cout << t << std::endl; //Outputs 0

  //

  Foo foo;
  std::cout << foo.i << std::endl; //Outputs garbage
  std::cout << foo.k << std::endl; //Outputs 0
  std::cout << foo.t << std::endl; //Outputs 0
}

1 个答案:

答案 0 :(得分:3)

k()uint64_t k = uint64_t()value-initialized,然后为零:

  

(8.4)否则,对象被零初始化。

t{}uint64_t t = {}list-initialized,默认为零。

由于Foo::iuint64_t i未初始化,因此会有不确定的值。

来自dcl.init/12

  

存储具有自动或动态存储持续时间的对象时   获得,对象具有不确定值,如果否   对象执行初始化,该对象保留一个   不确定值,直到该值被替换([expr.ass])