std :: apply是否为评估顺序提供保证?

时间:2017-05-14 00:22:51

标签: c++ c++17

在c ++中,未指定作为函数调用的参数提供的表达式的求值顺序。 当我使用std :: apply时,是否保证函数在元组的元素上被称为IN ORDER? 我有一个案例,重要的是函数首先应用于元组的第一个元素,然后是第二个元素,然后是第三个元素....

作为反例:

template <class Tuple, size_t... Is>
void function(Tuple t, std::index_sequence<Is...>) {
    some_func( my_func(get<Is>(t))... );
}

不保证在元组的每个元素上调用my_func的顺序。

2 个答案:

答案 0 :(得分:4)

我认为这应该有效:

using args_tuple_type = decltype( std::make_tuple(my_func(get<Is>(t))...) );
std::apply(some_func, args_tuple_type{ my_func(get<Is>(t))... });

因为my_func调用都在braced-initializer-list中,所以它们按顺序进行评估。 std::apply调用需要some_func,但排序保证不是来自std::apply

不是因为元组不是聚合,它是通过构造函数调用构造的,并且通常不按顺序计算构造函数参数。但是,如

中所述,使用大括号仍然可以获得排序

答案 1 :(得分:3)

  

我有一个案例,重要的是函数首先应用于元组的第一个元素,然后是第二个元素,然后是第三个元素....

然后你使用了错误的函数,因为std::apply做了一些与你想要的完全无关的事情。例如,

std::apply(f, std::make_tuple(1, 2))

返回

f(1, 2)

而不是试图单独调用f(1)f(2)