void f(int & i){
cout << "l-value-ref" << endl;
}
void f(int && i){
cout << "r-value-ref" << endl;
}
假设上面的代码,我们有一个重载函数,它分别采用l值引用和r值引用参数。
int x = 5;
f(x);
f(5);
const int j = 9;
f(j);
当我使用 const int j = 9 时,编译器会出现歧义错误。我怎么解决这个问题?
答案 0 :(得分:6)
您的编译器错误(如果确实是您提到的错误)会产生误导。这里真正错误的是,尝试将const int
参数传递给任何函数都会丢弃const
限定符,这是不允许的。您可以通过将签名更改为const int&
/ const int&&
来解决此问题(请注意const int&&
仍然无法使用const int
参数),或者添加另一个重载const
个参数,取决于您想要实现的目标。
基本上你要做的选择是在&#34;我需要一个版本,需要能够修改传递的参考&#34; (然后是2个版本)和&#34;我永远不会修改传递的参考文件&#34; (只是const int&
版本。)