[英]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
有兩個子對象: Parent
和i
。 因此,在braced-init-list中需要兩個初始值設定項:
Child c{ {}, 1 };
此外,為了使Child
成為聚合,所有子對象必須是公共的 。 所以你不能擁有私人基類。
當然,這假設Visual Studio正確實現了該功能。 VS2017 15.5不符合C ++ 17,但15.7支持此功能。
c ++ 17引入了一個擴展到聚合初始化(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
繼承來進行聚合初始化。
不幸的是, visual-studio-2017在版本15.7之前不支持P0017R1。 因此,可能需要升級Visual Studio才能完成此任務。
如果那是不可能的,並且你能夠在沒有多態性的情況下順利通過,你可以暫時定義:
struct Child {
Parent a;
int b;
};
這將允許您使用一致的代碼: Child c{ {}, 1 }
現在以及每當您在升級到15.7之后更改回繼承時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.