【问题标题】:C++11 integer initalizationC++11 整数初始化
【发布时间】:2018-10-11 05:59:21
【问题描述】:

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
}

【问题讨论】:

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


    【解决方案1】:

    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])

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 2020-02-08
      • 2012-06-12
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多