C++ 11花括号

25

我已经有好几年没有使用C++了,最近才遇到这个:

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

这些大括号有什么作用?我以前从未见过它们在函数调用中被使用。我猜这与函数指针有关,但似乎是可选的吗?


你如何使用元素列表初始化向量? - Marc Glisse
3个回答

29

std::vector有一个构造函数,可以接受一个 std::initializer_list

初始化列表可以用花括号表示。

因此,这段代码创建了一个向量,其中包含一个default_device,并将其传递给 build 成员函数。


1
仅供参考,std::initializer_list 是 C++11 中的新特性。许多 STL 容器,包括 std::vector,已经更新以支持在构造期间使用 std::initializer_list 作为输入。 - Remy Lebeau
感谢您的支持:“initializer_list可以用花括号表示” - rhughes
1
你是怎么知道 VECTOR_CLASS 就是 std::vector 的呢? - BЈовић
1
@BЈовић 根据示例代码和名称,最有可能是std::vector或类似的东西。 - Drax

14

在:

program.build({ default_device })

你正在自动实例化一个临时的VECTOR_CLASS<Device>对象。这相当于:

你正在自動實例化一個臨時的VECTOR_CLASS<Device>對象。這相當於:

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

相当于:

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

这将调用std::initializer_list构造函数

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

2
program.build({ default_device }) here 相当于 program.build(VECTOR_CLASS<Device>{ default_device }):前者是复制列表初始化,而后者是直接列表初始化。对于显式构造函数等情况,两者之间存在微妙的差异。 - dyp

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接