使用引用参数计算函数

Evaluating a function with reference parameters

本文关键字:计算 函数 参数 引用      更新时间:2023-10-16
#include <iostream>
using namespace std;
template <class T>
void swap1(T& a, T& b) {
    T c = a;
    a = b;
    b = c;
}
int main() {
    int n1 = 5;
    int n2 = 7;
    swap1(n1, n2);
    cout << n1 << " " << n2 << endl;
    int *p1 = &n1;
    int *p2 = &n2;
    swap1(*p1, *p2);
    cout << n1 << " "<< n2 << endl;
}

在许多语言中,调用函数时,首先计算其参数,然后将函数应用于计算结果。

然而,如果我们在这里遵循这个规则,swap1(n1, n2)swap1(*p1, *p2)都会评估为swap1(5, 7)这是没有意义的。

那么,在这种情况下,评估规则是什么?另外,在C++中评估函数的一般规则是什么?

在许多语言中,调用函数时,首先计算其参数,然后将函数应用于计算结果。

这正是C++发生的事情。但是,我们必须分析"评估函数的参数"实际上意味着什么。在C++中,它的意思是"使用指定为参数的表达式复制初始化参数"。复制初始化C++引用的方法是绑定到初始化器定义的实体。在左值引用的情况下(如在你的swap中),这意味着初始化器必须是左值。 n1是一个左值,*p1也是如此。由于引用需要一个左值,这就是所有要做的评估。

如果参数是值类型(不是引用),则在初始化值旁边将应用左值到右值的转换。但由于我们正在初始化引用,因此不会发生此转换。