簡體   English   中英

使用普通ctor統一初始化派生類

[英]Uniform initialization of derived class with trivial ctor

我試圖用c ++ 11統一初始化來解決一些極端情況,我無法弄清楚為什么這樣:

struct Base
{
    int x,y,z;
};

struct Derived : Base
{
};
static_assert (std::is_trivial<Base>::value, "Base must be trivial");
static_assert (std::is_trivial<Derived>::value, "Derived must be trivial");

Base b{1, 2, 3};           // 1) This compiles fine
Derived d{10, 20, 30};     // 2) This fails

使用clang 3.1g++ 4.7標記為2的行失敗,並且“沒有用於初始化Derived的匹配構造函數”消息。

我無法理解為什么,在Derived的情況下,它試圖調用構造函數而不執行(我不知道如何調用它,可能是聚合初始化 ?),就像第1行的情況一樣。

以下推理中的某些內容是錯誤的?:

A)微不足道的保證它可以靜態初始化

B)要靜態初始化沒有代碼必須在運行時執行,因此不需要構造函數調用A+B =>為什么它試圖在一個它知道微不足道的類型上調用構造函數?

我很困惑....

微不足道與如何初始化某事無關。 重要的一點是您的Derived類型是否是聚合 ,而不是這種情況:

§8.5.1 [dcl.init.aggr] p1

聚合是一個數組或類(第9節),沒有用戶提供的構造函數(12.1),非靜態數據成員(9.2)沒有大括號或等於初始值,沒有私有或受保護的非靜態數據成員(第11條), 沒有基類(第10條) ,沒有虛函數(10.3)。

只有聚合可以使用聚合初始化進行初始化,因此列表初始化(這是統一初始化的官方名稱)只能嘗試查找擬合構造函數。

你可以做的是提供一個constexpr構造函數,它轉發到基類,並添加一個default ed默認構造函數:

struct Derived : Base{
    Derived() = default;
    constexpr Derived(int a, int b, int c) : Base{a, b, c}{}
};

暫無
暫無

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

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