2017-02-22 90 views
4
void f(int & i){ 
    cout << "l-value-ref" << endl; 
} 

void f(int && i){ 
    cout << "r-value-ref" << endl; 
} 

假设上面的代码,我们有一个重载函数,它分别采用l值参考和r值参考参数。l值参考和r值参考的结合误差

int x = 5; 
f(x); 
f(5); 
const int j = 9; 
f(j); 

当我使用const int的J = 9编译器给模糊误差。我怎么解决这个问题?

+0

将第一个'f()'改为'const int&i'参数。 –

+0

我很惊讶你的编译器给你这个错误。我给了我“绑定const int到类型int和抛弃限定符的引用”。 – SingerOfTheFall

+3

如果它给出*歧义*错误,那么我认为这个错误是**误导**,因为它们都不能用'int const'类型的参数'j'调用。编译器应该给*“没有找到接受'int const&'”*的函数。 – Nawaz

回答

6

您的编译器错误(如果确实是您提到的错误)是误导性的。这里真正错误的是试图将const int参数传递给您的任何函数将丢弃const限定符,这是不允许的。您可以通过将签名更改为const int&/const int&&(请注意const int&&仍然不能与const int参数一起使用),或者通过为const参数添加另一个过载来解决此问题,具体取决于您想要达到的目标。

基本上,你必须做出的选择是在“我需要一个需要能够修改传递的引用的版本”(然后是2个版本)和“我永远不会修改传递的引用”(只是const int&版本)。