2014-01-25 125 views
20

我沒有使用C++了好幾年了,剛纔遇到這樣的:C++ 11大括號

program.build({ default_device }) 

的定義是:

cl_int build(
    const VECTOR_CLASS<Device>& devices, 
    const char* options = NULL, 
    void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, 
    void* data = NULL) const 

什麼大括號有對於?我從來沒有見過他們在這樣的函數調用中使用過。我認爲它與函數指針有關,但似乎是可選的?

+0

你如何用元素列表初始化一個向量? –

回答

25

std::vector有一個構造函數的std::initializer_list

initializer_list可以用大括號表示。

因此,此代碼創建一個向量,其中包含一個default_device並將其傳遞給build成員函數。

+1

Just FYI,'std :: initializer_list'在C++ 11中是新的。許多STL容器,包括'std :: vector',已經被更新以支持'std :: initializer_list'作爲構建期間的輸入。 –

+0

謝謝你:「一個initializer_list可以用花括號表示」 – rhughes

+1

你怎麼知道'VECTOR_CLASS'是'std :: vector'? –

14

在:

program.build({ default_device }) 

你會被自動實例化一個臨時VECTOR_CLASS<Device>對象。它等效於:

program.build(VECTOR_CLASS<Device>{ default_device }) 

這相當於:

program.build(std::vector<Device>{ default_device }) 

它將調用the std::initializer_list constructor

std::vector::vector(std::initializer_list<T> init, 
    const Allocator& alloc = Allocator()); 
+2

'program.build({default_device})'* here *等同於'program.build(VECTOR_CLASS {default_device})':前者是複製列表初始化,而另一個則是直接列表初始化。有一個微妙的差別,例如爲明確的ctors。 – dyp