[英]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.