[英]C++14 Uniform Initialization on a Non-Aggregate
我正在使用Visual C ++ 2013.当类是聚合时,它是零初始化的。 当它是非聚合时,它似乎是默认初始化并且不确定。 这是为什么?
#include <iostream>
using namespace std;
class Test_1
{
public:
int i;
void f(){};
};
class Test_2
{
public:
int i;
virtual void f(){};
};
int main()
{
Test_1 t1{};
Test_2 t2{};
cout<<t1.i<<endl; //0
cout<<t2.i<<endl; //-858993460
getchar();
}
如果您的编译器正在执行此操作,则它已损坏。
[dcl.init.list] / p3(所有报价均来自N4140):
列表初始化对象或类型
T
引用定义如下:
- 如果
T
是聚合,则执行聚合初始化(8.5.1)。- 否则,如果初始化程序列表没有元素且
T
是具有默认构造函数的类类型,则对象将进行值初始化。- [...]
[dcl.init] / P8:
对值类型
T
的对象进行值初始化意味着:
- 如果
T
是一个(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或者是用户提供或删除的默认构造函数,那么该对象是默认初始化的;- 如果
T
是一个(可能是cv限定的)类类型而没有用户提供或删除的默认构造函数,那么该对象是零初始化的,并且检查默认初始化的语义约束,如果T有一个非平凡的默认构造函数,该对象是默认初始化的;- 如果T是数组类型,那么每个元素都是值初始化的;
- 否则,该对象被零初始化。
Test_2
不是聚合,因此t2
应该已经过值初始化。 反过来,由于Test_2
的默认构造函数不是用户提供的,因此t2
应该首先进行零初始化(使t2.i
初始化为0),然后运行默认构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.