簡體   English   中英

是否合法使用initializer_list初始化具有派生類型的對象?

[英]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中嘗試過該代碼。它可以編譯,但是當我運行它時,我可以看到(調試)如何:

  1. 為第一個對象D{1}創建類D的對象(調用tempD1 )。 調用D構造函數,然后調用B構造函數。
  2. tempD1的基礎移至新的B對象( tmpB1 ):調用B move構造函數。
  3. 第二個對象D{2}tmpD2tmpB2 )相同。
  4. Foo初始化列表構造器被調用。 此時一切都很好。
  5. tmpB2析構tmpB2被調用一次。
  6. tmpD2析構tmpD2被調用兩次
  7. 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.

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