[英]Uniform initialization doesn't work for initialization parent object in 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.1
和g++ 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.