C ++ 11是否可以构造一个std :: initializer_list?

时间:2015-03-28 05:53:22

标签: c++11 initializer-list

我有一个使用std::discrete_distribution的类,可以使用std::initializer_list或几个迭代器。我的课程在某种程度上包裹着discrete_distribution,所以我真的想模仿能够接受std::initializer_list然后传承下来的能力。

这很简单。

但是,std::initializer_list将始终通过一些未知值构建。所以,如果它只是一个std::discrete_distribution我只是从一些容器的迭代器构造。但是,为了让我通过我的班级提供,我需要为Iterator类型模板化。

我不想模仿我的课程,因为它偶尔会使用initializer_list,而在它不使用的情况下,它会使用{{1这将使这个模板参数,可能令人困惑。

我知道我可以默认模板参数,我知道如果我愿意,我只能定义std::uniform_int_distribution s;我只是不愿意。

1 个答案:

答案 0 :(得分:3)

根据文档,std::initializer_list不能在标准C ++中构造为非空。顺便说一句,对于C stdarg(3) va_list来说也是一样的(并且可能出于类似的原因,因为可变函数参数传递是特定于实现的并且通常具有其自己的ABI特性;但是请参见{{3 }})。

libffi中,std::initializer_list以某种方式已知到C ++编译器(同样<stdarg.h>使用C编译器中的一些内置函数),并且有特殊支持

C ++ 11标准(更确切地说是它的GCC草案,几乎完全相同)在§18.9.1中说std::initializer_list只有一个空构造函数并引用§8.5。 4 列表初始化

你可能应该在你的情况下使用std::vector及其迭代器。

根据经验,直观地说,std::initializer_list对于编译时已知参数列表很有用,并且如果你想处理运行时已知参数(在编译时未知“参数”的“数字”)你应该为这种情况提供一个构造函数(将一些迭代器或一些容器作为参数)。

如果您的类有一个接受std::initializer_list<int>的构造函数,它可能应该有另一个构造函数接受std::vector<int>std::list<int>(如果您有一些可交换性,可能还是std::set<int>),那么你在迭代器上不需要一些奇怪的模板。顺便说一句,如果你想要迭代器,你会模板化构造函数,而不是整个类。