以下代码是否符合 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
}
答案 0 :(得分:3)
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])