void foo(const int& v) {
int x = v;
std::cout << x;
}
int main()
{
unsigned y = 1;
foo(y);
}
传递y
代替C ++中的const int&
合法
答案 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;
所以除了你明确给出的之外的所有重载都将被删除。