c ++中的评估顺序初始化数组

Khu*_*hid 9 c++ array-initialization variadic-templates c++11

我喜欢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");

}
Run Code Online (Sandbox Code Playgroud)

问:数组初始化的评估顺序是顺序还是任意(或实现定义,未定义的行为)?

如果make_vector 错了,我怎么解决它?

Cas*_*sey 12

它们按顺序评估.C++11§8.5.4[dcl.init.list]第4段:

内的初始列表一个的支撑-INIT列表中,初始化子句,从包扩展(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)... };
}
Run Code Online (Sandbox Code Playgroud)

而不必担心奥术初始化语义;)