簡體   English   中英

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應該首先進行零初始化(使t2.i初始化為0),然后運行默認構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM