为什么不同的类型变量可以用作C++中const引用参数的参数的参数

xia*_*g z 8 c++ pass-by-reference

void foo(const int& v) {
    int x = v;
    std::cout << x;
}

int main()
{
    unsigned y = 1;
    foo(y);
}
Run Code Online (Sandbox Code Playgroud)

是用C++ y代替const int&合法的

Fra*_*eux 9

有两个因素可以让您的代码工作.首先,如果允许函数参数匹配重载,则允许最多一次隐式转换.其次,const引用可以绑定到临时工.这里发生的事情y是隐式转换为int,创建一个临时副本.v然后绑定到那个临时的.

请考虑以下示例:

#include <iostream>

void foo(const unsigned int & v) {
    std::cout << &v << '\n';
}

void bar(const int & v) {
    std::cout << &v << '\n';
}

int main()
{
    unsigned int y = 1;
    std::cout << &y << '\n';
    foo(y);
    bar(y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您会发现foo(y)打印的地址ybar(y)打印不同地址的地址相同.这不适用于非const引用.值得注意的是,如果可以的话,这意味着改变v可能实际上并没有改变y.