在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的顺序。
答案 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)
。