参数评估后参数绑定是否排序?

fre*_*low 13 c++ evaluation parameter-passing move-semantics c++11

假设我有以下功能:

void foo(std::vector<int> vec, int n);
Run Code Online (Sandbox Code Playgroud)

如果我这样调用函数:

std::vector<int> numbers { 2, 3, 5, 7, 11, 13, 17, 19 };
foo(std::move(numbers), numbers[0]);
Run Code Online (Sandbox Code Playgroud)

在绑定参数之前是否完全评估了所有参数?在这种情况下,它std::move是无害的,因为它只是产生一个xvalue指的numbers.或者,一旦评估,每个单独的参数是否可以立即绑定到其参数?在这种情况下,numbers[0]可能会导致未定义的行为,因为numbers可能已经被移入vec.

R. *_*des 10

在§1.9/ 15我们被告知:

当调用函数时(无论函数是否为内联函数),与任何参数表达式相关联的每个值计算和副作用,或者使用指定被调用函数的后缀表达式,都会在执行每个表达式或语句之前对其进行排序.叫功能.(......)

关于§5.2.2/ 4:

(...)每个参数的初始化和销毁​​发生在调用函数的上下文中.(......)

我在最终草案中找不到任何其他相关文字.由于这种没有明确定义之前测序的评价参数和参数的初始化的关系,他们是未测序std::move是不是无害的.

解决此问题的方法是强制使用临时变量的序列:

std::vector<int> numbers { 2, 3, 5, 7, 11, 13, 17, 19 };
int num = numbers[0];
foo(std::move(numbers), num);
Run Code Online (Sandbox Code Playgroud)