从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::i
和 uint64_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/