gpt4 book ai didi

c++ - 参数评估后是否对参数绑定(bind)进行排序?

转载 作者:IT老高 更新时间:2023-10-28 23:01:02 26 4
gpt4 key购买 nike

假设我有以下功能:

void foo(std::vector<int> vec, int n);

如果我这样调用函数:

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

在绑定(bind)到参数之前,是否所有参数都已完全评估?在这种情况下,std::move 是无害的,因为它只是产生一个引用 numbers 的 xvalue。或者每个单独的参数是否可以在评估后立即绑定(bind)到它的参数?在这种情况下,numbers[0] 可能会导致未定义的行为,因为 numbers 可能已经被 move 到 vec 中。

最佳答案

在 §1.9/15 中,我们被告知:

When calling a function (whether or not the function is inline), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function. (...)

第 5.2.2/4 节:

(...) The initialization and destruction of each parameter occurs within the context of the calling function. (...)

我在最终草案中找不到任何其他相关文本。由于这没有明确定义参数评估和参数初始化之间的 sequenced before 关系,因此它们是 unsequencedstd::move 不是无害的。

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

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

关于c++ - 参数评估后是否对参数绑定(bind)进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7229234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com