我喜欢c ++ 11可变参数模板,因此我经常用它编写一些小代码。
见这个例子:
#include <cstdio>
#include <type_traits>
#include <vector>
template< typename ... T >
auto make_vector(T ... t ) -> std::vector< typename std::common_type<T...>::type >
{
std::vector< typename std::common_type<T...>::type > v;
v.reserve( sizeof...(T) );
using list = int[];
(void)list{ 0, ( (void)v.push_back(std::move(t)) ,0)... };
// |/ / / /
// --------
// \-- How are evaluated v.push_back()s, sequentially or arbitrary ?
return v;
}
int main()
{
auto v = make_vector(2, 3.0, 'a', 7UL );
for(auto e : v )
printf("%.2lf ", e);
printf("\n");
}
问:数组初始化的评估顺序是顺序的还是任意的(或实现定义的,未定义的行为)?
如果make_vector
错了,我该如何解决?
答案 0 :(得分:12)
按顺序评估它们。 C ++11§8.5.4[dcl.init.list]第4段:
在 braced-init-list 的 initializer-list 中, initializer-clauses ,包括包中的任何结果 扩展(14.5.3),按它们出现的顺序进行评估。
鉴于vector
有一个initializer_list
构造函数,您可以将函数简化为:
template <typename ... T>
auto make_vector(T ... t) ->
std::vector< typename std::common_type<T...>::type >
{
return { static_cast<typename std::common_type<T...>::type>(t)... };
}
并且不必担心神秘的初始化语义;)