c ++中的初始化列表

时间:2014-03-06 17:56:04

标签: c++ c++11

我正在阅读有关初始化列表的信息,并在coliru

上尝试了以下代码
#include <iostream>
#include <string>
#include <vector>
#include <initializer_list>

class dog
{
    public:
    int age;
    dog(int a)
    {
        age = a;
        std::string name;
    }
    dog(const iterator_list<int>& vec)
    {
        age = *(vec.begin());
    }
};

int main()
{

    return 0;
}

然而,似乎初始化列表构造函数

存在问题
dog(const iterator_list<int>& vec)
{
    age = *(vec.begin());
}

有什么建议吗?为什么会有问题?

2 个答案:

答案 0 :(得分:1)

它汇编为:dog(const std::initializer_list<int>& vec)

答案 1 :(得分:1)

您应该使用std::initializer_list,因为根据文档,这样的对象在以下情况下由编译器构造:

  • braced-init-list用于列表初始化对象,相应的构造函数接受std::initializer_list参数
  • braced-init-list用作赋值的右操作数或函数调用参数,相应的赋值运算符/函数接受std::initializer_list参数。

所以你可以这样:

#include <iostream>
#include <string>
#include <vector>
#include <initializer_list>

class dog
{
    public:
    int age;
    dog(int a)
    {
        age = a;
        std::string name;
    }
    dog(const initializer_list<int>& vec)
    {
        age = *(vec.begin());
    }
};

用于构造类,您可以像这样使用它:

dog d1( { 12, 16, 18, 20 } ); // if you will want more initialization data in the future
dog d2 = { 12 }; // or this, for now

age的值为12

您始终必须处理您的方法/类所属的命名空间:

  • 使用std::initializer_list<int>
  • 使用using namespace std;

另请注意,为了选择构造函数,默认值和initializer_lists构造函数优先:

template<typename T>
struct Vector {
  Vector(const std::initializer_list<T> &values);
  Vector();
  Vector(const int size);
  Vector(const int size, const T& fill_with);
};

Vector<int> v1 {}; // empty list: the default constructor will be picked
Vector<int> v2 { 12 }; // the initializer_list constructor will be used
Vector<int> v3 (12); // Vector(const int) will be used
Vector<int> v4 (12, 0); // Vector(const int, const int&) will be used

请在repl.it上查看。