С ++ 11 целочисленная инициализация - PullRequest
0 голосов
/ 01 мая 2018

Является ли следующий код правильным с 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 голосов
/ 01 мая 2018

k() и uint64_t k = uint64_t() равны value-initialized, которые затем будут равны нулю:

(8.4) В противном случае объект инициализируется нулями.

t{} и uint64_t t = {} - это list-initialized, по умолчанию равное нулю.

Поскольку Foo::i и uint64_t i неинициализированы, они будут иметь неопределенное значение.

С dcl.init / 12 :

При хранении объекта с автоматическим или динамическим сроком хранения объект имеет неопределенное значение , а если нет инициализация выполняется для объекта, этот объект сохраняет неопределенное значение, пока это значение не будет заменено ([expr.ass])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...