C++11 整数初始化

标签 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
}

最佳答案

k()uint64_t k = uint64_t()value-initialized那将是零:

(8.4) Otherwise, the object is zero-initialized.

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

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

来自 dcl.init/12 :

When storage for an object with automatic or dynamic storage duration is obtained, the object has an indeterminate value, and if no initialization is performed for the object, that object retains an indeterminate value until that value is replaced ([expr.ass])

关于C++11 整数初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50112383/

相关文章:

c++ - 这个指向基类构造函数的指针?

c++ - 在客户区外绘图,winAPI

C++ istream 与 lex

c++ - 模板参数数量错误

c++ - 为什么 Boost.Range is_sorted 不需要前向迭代器?

c++ - 是否有符合标准的方法来确定非静态成员的对齐方式?

c++ - 在 C++17 中调用对象生命周期之外的非静态成员函数

c++ - 在 C++ 中进行文件解析时跳到特定的行值

c++ - QMap::operator[](const Key & key) 为什么按值返回?

c++ - 在其声明语句中修改变量是否定义明确?