void foo(const int& v) {
int x = v;
std::cout << x;
}
int main()
{
unsigned y = 1;
foo(y);
}在C++中传递y代替const int& legal
发布于 2018-02-07 00:20:51
有两个因素可以让你的代码工作。首先,如果允许函数参数匹配重载,则函数参数最多允许一个隐式转换。其次,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。
发布于 2018-02-07 00:31:57
是的,这可能是相当烦人的。由于在调用站点将y隐式转换为匿名临时int而导致编译通过,并且允许const int&绑定。
您可以通过编写以下代码来解决此问题
void foo(unsigned v) = delete;甚至是
template<typename Y> void foo(Y v) = delete;因此,除您显式指定的重载之外的所有重载都将被删除。
https://stackoverflow.com/questions/48647305
复制相似问题