2017-04-13 86 views
2

我看到一个函数,它接受一个std :: vector的引用,并且传递给它的参数让我感到困惑,因为发生了什么。它看起来像这样:在这个std :: vector构造函数中发生了什么?

void aFunction(const std::vector<int>& arg) { } 


int main() 
{ 
    aFunction({ 5, 6, 4 }); // Curly brace initialisation? Converting constructor? 

    std::vector<int> arr({ 5, 6, 4 }); // Also here, I can't understand which of the constructors it's calling 

    return 0; 
} 

谢谢。

回答

1

这叫做std::initializer_list。它自C++ 11以来就在那里。

以下是reference manual的工作原理。

5

为对象通过这样的结构来创建你需要提供构造函数接受std::initializer_liststd::vectorone (8)

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

你可以看到,以及在该网页上的例子:

// c++11 initializer list syntax: 
std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"}; 

注:C++ 11还允许通过大括号对对象进行初始化:

Someobject { 
    Someobject(int){} 
}; 

Someobject obj1(1); // usual way 
Someobject obj2{1}; // same thing since C++11 

,但你必须要小心,如果对象已男星提到它会被用来代替之前:

std::vector<int> v1(2); // creates vector with 2 ints value 0 
std::vector<int> v2{ 2 }; // creates vector with 1 int value 2 

注2:你的问题列表如何创建它的文档中描述:

std :: initializer_list对象在以下情况下自动构造:

在列表初始化中使用braced-init-list,包括函数调用列表初始化和赋值表达式

一个支撑,初始化列表势必汽车,包括在远程for循环

+0

是如何初始化器列表从大括号列表中创建?它是初始化列表的一部分转换构造函数吗? – Zebrafish

+0

谢谢。我永远不会停止学习这种语言。 – Zebrafish

相关问题