c++中的求值顺序初始化数组



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

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

如果make_vector出错,我该如何修复它?

它们是按顺序求值的。C++11§8.5.4[dcl.init.list]第4段:

支持的初始化列表初始值设定项列表始化项子句,包括从pack膨胀(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)... };
}

并且不必担心晦涩难懂的初始化语义;)

最新更新