2017-09-16 114 views
1

以下工作:C++ 11:是否有可能從函數返回一個std :: initializer_list?

struct A { 
    int i; 
    int v; 
}; 

std::initializer_list<A> getList() { 
    return {A{0,1}, A{2,3}}; 
} 

int main() { 
    auto list = getList(); 
} 

我可以驗證列表的內容是正確的。

不過,如果我更改成員v到一個載體,這是行不通的:

struct A { 
    int i; 
    std::vector<int> v; 
}; 

std::initializer_list<A> getList() { 
    return {A{0,{1,2}}, A{3,{4,5}}}; 
} 

在這種情況下,返回的列表包含垃圾值。

我知道標準說複製initializer_list時不會複製下層對象。這是發生在這裏嗎?

爲什麼它在第一個例子中工作?運氣好嗎?當列表中的對象包含一個向量時,是否有特殊情況?

回答

1

返回initializer_list編譯,但它很少做正確的事情。該列表是一個臨時值,並且initializer_list對象指向它。這是一個懸掛指針。

在第一個示例中,應用了優化,因爲該列表是一個常量表達式。它不是寫入臨時存儲,而是靜態的全局。但是,這個優化在標準中沒有規定。返回值的工作,只是一種未定義的行爲。

相關問題