2016-11-25 65 views
3

我對初始化列表有點困惑。STL獨立初始化列表

我認爲初始化列表的東西是什麼的C++部分:

struct Something { char c0, c1; }; 

Something something = { 'H', 'W' }; 
與陣列等

類推而有一些東西連接(在我眼裏)與STL(在頭<initializer_list>),叫std::initializer_list<T>,它與初始值列表匹配,例如方法參數,可以等

std::initializer_list<char> list = { 'H', 'e', 'l', 'l', 'o' }; 

現在我的困惑:

auto match = { 'H', 'e', 'l', 'l', 'o' }; 

當我看到什麼是auto解釋(在2015年MSVC),它是std::initializer_list<char>

所以我的問題是:

在哪裏線之間的C++語言和STL庫?

是否有一些指令指定初始化程序列表(C++含義)應如何解釋?

可以解釋變化例如從std::initializer_list<T>轉換爲T[]

+2

語言和標準庫一起工作。編譯器可以創建並傳遞例如需要時使用'std :: initializer_list'。但是,第一個示例顯示,在初始化結構時,不會創建「std :: initializer_list」。這是結構的直接初始化。 –

+0

當您編寫「STL」時,我們假定您的意思是「標準庫」。 – MSalters

+0

@ MSalters https://en.wikipedia.org/wiki/Standard_Template_Library – user4663214

回答

0

部分基於MSDN thread的答案。

C++語言和STL庫之間的界限在哪裏?

標準庫和純C++之間的界限有點​​嘈雜。 它位於名爲LSL語言支持庫的庫的一部分。 該行存在於以下示例中:分配返回std::bad_alloc因此,從C++語言的觀點來看純粹的,std::bad_alloc可以通過OS API直接分配來抑制。 類似地用標準::爲size_t,性病:: nullptr_t等...

在下面的示例中,線,如果存在,是嘈雜:dynamic_cast的拋出std::bad_cast 基本性LSL和C++的類似示例是初始化程序列表。

是否有一些指令指定初始化程序列表(C++含義)應如何解釋?

作爲語言規範存在的指令,作爲#pragma指令種類的指令或任何可以簡單改變的指令都不會。

可以解釋變化例如從std :: initializer_list到T []?

在MSVC中,沒有。可能沒地方。

1

這是一個aggregate initialization

struct Something { char c0, c1; }; 
Something something = { 'H', 'W' }; 

哪裏是C++語言和STL庫之間的界限?

這是不是真的C++語言STL庫因爲標準庫本身是用C語言編寫的差異++(它沒有意義的,認爲它們是兩個獨立的實體)。要點在於區分你正在初始化哪種元素和哪些構造函數可用。

大部分的困惑源於這樣一個事實,即提案和缺陷報告激起了很多關於如何解釋花括號初始化的爭論(cfr。Scott Meyers articles,其中一些也是recently discussed)。

是否有一些指令指定初始化程序列表(C++含義)應如何解釋?

的唯一正確的方法去理解它是能夠識別您所使用的類型和理解C++ standard指令(根據C++版本和編譯器支持您正在使用)。

+0

謝謝你的答案。提到的文章正好顯示了我的困惑。 – user4663214