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.
我有一个 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.