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

C++11 is it possible to construct an std::initializer_list?

我有一个 class,它使用一个 std::discrete_distribution,它可以接受一个 std::initializer_list 或几个迭代器。我的 class 在某些方面包裹了 discrete_distribution 所以我真的很想模仿接受 std::initializer_list 然后被传递下来的能力。

这个很简单。

但是,std::initializer_list总是会通过一些未知的值来构建。所以,如果它只是一个 std::discrete_distribution 我会从一些容器的迭代器构造。但是,为了通过我的 class 使它可用,我需要为 Iterator 类型模板化 class。

我不想为我的 class 设置模板,因为它只是偶尔会使用 initializer_list,在不使用的情况下,它会使用 std::uniform_int_distribution这会使这个模板参数变得混乱。

我知道我可以默认模板参数,而且我知道如果我愿意,我可以只定义 vector::iterator;我宁愿不要。

根据文档,std::initializer_list cannot be non-empty constructed in standard C++. BTW, it is the same for C stdarg(3) va_list (and probably for similar reasons, because variadic function argument passing is implementation specific and generally has its own ABI peculiarities; see however libffi)。

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

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

您可能应该使用 std::vector 及其迭代器。

根据经验和直觉,std::initializer_list 对于 编译时 已知参数列表很有用,如果您想处理 运行-time 已知参数(编译时 "arguments" 的 "number" 未知)你应该为这种情况提供一个构造函数(采用一些迭代器,或者一些容器,作为参数)。

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