gpt4 book ai didi

c++ - 函数参数求值顺序 : is it UB if we pass reference?

转载 作者:IT老高 更新时间:2023-10-28 22:21:27 26 4
gpt4 key购买 nike

这是未定义的行为:

void feedMeValue(int x, int a) {
cout << x << " " << a << endl;
}
int main() {
int a = 2;
int &ra = a;
feedMeValue(ra = 3, a); // equivalent to: feedMeValue(a = 3, a) (see note bellow)
return 0;
}

因为根据首先评估的参数,我们可以调用 (3, 2)(3, 3)

但是:

void feedMeReference(int x, int const &ref) {
cout << x << " " << ref << endl;
}

int main() {
int a = 2;
int &ra = a;
feedMeReference(ra = 3, a); // equivalent to: feedMeReference(a = 3, a) (see note bellow)
return 0;
}

总是会输出 3 3 因为第二个参数是一个引用并且所有参数在函数调用之前都已经被计算过了,所以即使第二个参数在 ra = 3 之前或之后被计算过,该函数收到了对 a 的引用,该引用在评估时将具有 23 的值,但是在函数调用时将始终具有值 3

第二个例子是 UB 吗?知道这一点很重要,因为如果编译器检测到未定义的行为,它可以自由地做任何事情,即使我知道它总是会产生相同的结果。


注意:我将留下 feedMeReference(ra = 3, a) 作为一些答案引用 ra 但您应该注意更简单的等效项问题是如果我们调用 feedMeReference(a = 3, a) (更简单,因为我们消除了 ra 这正是我们问题的方式(第二个参数是引用))。

最佳答案

这是一个有趣的问题。在您的第一种情况下,有未定义的行为,因为对象被修改并且在没有插入序列点的情况下访问(在语言中C++03---C++11 用不同的语言本质上说一样)。第二,没有未定义的行为,因为用左值初始化引用不能访问对象,所以唯一的访问是 ra = 3。 (调用函数建立一个序列点,因此在函数在它们和 ra = 3 之间有一个序列点。)

关于c++ - 函数参数求值顺序 : is it UB if we pass reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24179986/

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