簡體   English   中英

使用具有繼承的結構的初始化列表

[英]Using initializer list for a struct with inheritance

我有一個結構,我想使用初始化列表初始化

struct Parent{};

struct Child : private Parent {
    int b;
};

int main() {
    Child c{ 1 };
    return 0;
}

看看其他問題,我發現這個答案表明它應該可以在c ++ 17中使用。

但是,當我在VS2017嘗試上面的代碼片段時,我得到了

Error   C2440   'initializing': cannot convert from 'initializer list' to 'child'

有沒有辦法利用這個新功能?

通過繼承,聚合的每個基類子對象都像成員一樣初始化。 因此,為了聚合初始化, Child有兩個子對象: Parenti 因此,在braced-init-list中需要兩個初始值設定項:

Child c{ {}, 1 };

此外,為了使Child成為聚合,所有子對象必須是公共的 所以你不能擁有私人基類。

當然,這假設Visual Studio正確實現了該功能。 VS2017 15.5不符合C ++ 17,但15.7支持此功能。

引入了一個擴展到聚合初始化(P0017R1) ,它提供了構建派生實例的同時仍然顯式初始化基類:

struct base { int a1, a2; };
struct derived : base { int b1; };

derived d1{{1, 2}, 3};      // full explicit initialization
derived d1{{}, 1};          // the base is value initialized

因此,使用“擴展到聚合初始化”,您將要使用代碼: Child c{ {}, 1 }Nicol Bolas的回答中所提到的那樣,他再次提出警告,您需要使用public private繼承來進行聚合初始化。

不幸的是, 版本15.7之前不支持P0017R1。 因此,可能需要升級Visual Studio才能完成此任務。


如果那是不可能的,並且你能夠在沒有多態性的情況下順利通過,你可以暫時定義:

struct Child {
    Parent a;
    int b;
};

這將允許您使用一致的代碼: Child c{ {}, 1 }現在以及每當您在升級到15.7之后更改回繼承時。

暫無
暫無

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

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