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

时间:2018-02-06 16:12:55

标签: c++ pass-by-reference

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

int main()
{
    unsigned y = 1;
    foo(y);
}

传递y代替C ++中的const int&合法

2 个答案:

答案 0 :(得分: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;
}

您会发现foo(y)打印的地址与y相同,而bar(y)打印的地址不同。这不适用于非const引用。值得注意的是,如果可以的话,这意味着更改v可能实际上不会更改y

答案 1 :(得分:3)

是的,这可能非常烦人。由于在调用站点将y隐式转换为匿名临时int而导致编译通过,并且允许const int&绑定。

你可以通过写

来打败这个
void foo(unsigned v) = delete;

甚至

template<typename Y> void foo(Y v) = delete;

所以除了你明确给出的之外的所有重载都将被删除。