gpt4 book ai didi

c++ - VC++ 的一个大错误?为什么初始化列表不对结构进行值初始化?

转载 作者:可可西里 更新时间:2023-11-01 18:38:38 28 4
gpt4 key购买 nike

C++11 标准 8.5.4.3 说:

“如果初始化列表没有元素并且 T 是具有默认构造函数的类类型,则该对象是值初始化的。”

struct A
{
int get() { return i; }

private:
int i;
};

int main()
{
A a = {};

int n = a.get();
cout << n << endl;
// n is a random number rather than 0

return 0;
}

这是VC++的错误吗?我的 VC++ 是最新的 2012 年 11 月的 CTP。

最佳答案

8.5p8 涵盖了非聚合类类型的值初始化。在你的情况下,(非 union )类有一个隐式声明的默认默认无参数构造函数(12.1p5),它没有被删除并且是微不足道的(同上)。因此 8.5p8 的第二个项目符号适用:

— if T is a (possibly cv-qualified) non-union class type without a user-provided or deleted default constructor, then the object is zero-initialized and, if T has a non-trivial default constructor, default-initialized;

所以A应该被零初始化,程序应该打印0

在下面的程序中:

struct A { int get() { return i; } private: int i; };
#include <iostream>
int main() {
char c[sizeof(A)];
new (c) int{42};
std::cout << (new (c) A{})->get() << '\n';
}

gcc-4.7.2 正确输出0; gcc-4.6.3 错误地输出 42; clang-3.0 变得非常疯狂并输出垃圾(例如 574874232)。

关于c++ - VC++ 的一个大错误?为什么初始化列表不对结构进行值初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904020/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com