[英]Is legal use initializer_list to initialize an object with derived types?
好吧,也許從標題上不清楚我實際上要問什么。
我有一個帶有初始化列表構造器std::initializer_list<B>
。 是否使用D
類的初始構造函數列表初始化合法,其中D
是從B
派生的?
#include <initializer_list>
struct B {
B(int) {}
};
struct D: public B {
D(int s): B(s) {}
};
struct Foo {
Foo(std::initializer_list<B> l) {}
};
void main() {
Foo f{ D{ 1 }, D{ 2 } };
}
如果不合法,那是不是格式錯誤? 還是只是不確定的行為?
我已經在Visual Studio 2013 Update 1中嘗試過該代碼。它可以編譯,但是當我運行它時,我可以看到(調試)如何:
D{1}
創建類D
的對象(調用tempD1
)。 調用D
構造函數,然后調用B
構造函數。 tempD1
的基礎移至新的B
對象( tmpB1
):調用B
move構造函數。 D{2}
( tmpD2
, tmpB2
)相同。 Foo
初始化列表構造器被調用。 此時一切都很好。 tmpB2
析構tmpB2
被調用一次。 tmpD2
析構tmpD2
被調用兩次 。 tmpD1
析構tmpD1
被調用一次。 我猜這是編譯器的錯誤(兩次調用一個析構函數,而錯過了另一個析構函數)。 但是我不確定std :: initializer_list的使用是否合法。
(解決了有關“ D”或“ A”名稱的困惑)
從std::initializer_list<D>
到std::initializer_list<B>
的轉換無效...但是用一些D
構造std::initializer_list<B>
是有效的(這就是這里發生的情況)...
但是你將有對象切片
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.