xml*_*lmx 7 c++ aggregate initialization initializer-list c++11
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;
}
Run Code Online (Sandbox Code Playgroud)
这是VC++的错误吗?我的VC++是最新的2012年11月CTP.
8.5p8 涵盖了非聚合类类型的值初始化。在您的情况下,(非联合)类有一个隐式声明的默认默认无参数构造函数(12.1p5),它不会被删除并且很简单(同上)。因此 8.5p8 的第二个项目符号适用:
\n\n\n\n\n\xe2\x80\x94 如果
\nT是一个(可能是 cv 限定的)非联合类类型,没有用户提供或删除的默认构造函数,则该对象为零初始化,并且,如果T有一个重要的默认构造函数,则默认 -已初始化;
所以A应该是零初始化,并且程序应该打印0。
关于以下程序:
\n\nstruct A { int get() { return i; } private: int i; };\n#include <iostream>\nint main() {\n char c[sizeof(A)];\n new (c) int{42};\n std::cout << (new (c) A{})->get() << '\\n';\n}\nRun Code Online (Sandbox Code Playgroud)\n\ngcc-4.7.2 正确输出0;gcc-4.6.3 错误输出42;clang-3.0 绝对疯狂并输出垃圾(例如574874232)。
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |