C++14在非聚合上的统一初始化
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
应该首先初始化为0(导致t2.i
初始化为0),然后运行默认构造函数。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 关于 C++14 lambda 的初始化捕获
- g++和g++14的未初始化值的差异
- 初始化 C++14 中唯一指针向量的正确方法
- C++14 结构体上的统一初始化
- 默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
- 使用 k 个键值对为零的存储桶初始化 c++14 unordered_map
- C++14 元编程:在编译/初始化时自动构建类型列表
- C++14 值初始化问题
- C++14在非聚合上的统一初始化
- 在C++14中,对浮点变量进行双重赋值的统一初始化不会产生缩小错误
- 在C++(98、11和14)中初始化静态数据成员的正确方法是什么
- C++14正在初始化类构造函数初始化列表中的继承成员
- 使用c++14初始化程序
- C++14 constexpr静态const std::数组初始化
- c++ 11/ c++ 14中的auto和大括号初始化
- vc++ 14 (VS2015)中数组值初始化的内部编译器错误