左值引用和右值引用中的绑定错误
binding error in l-value reference and r-value reference
void f(int & i){
cout << "l-value-ref" << endl;
}
void f(int && i){
cout << "r-value-ref" << endl;
}
假设上面的代码,我们有一个重载函数,它分别接受 l-value-reference 和 r-value-reference 参数。
int x = 5;
f(x);
f(5);
const int j = 9;
f(j);
当我使用 const int j = 9 时,编译器给出了歧义错误。我怎么解决这个问题?
您的编译器错误(如果确实是您提到的错误)具有误导性。这里真正错误的是,尝试将 const int
参数传递给任何函数都会丢弃 const
限定符,这是不允许的。您可以通过将签名更改为 const int&
/ const int&&
(请注意 const int&&
仍然无法使用 const int
参数)或通过添加另一个重载来解决它const
个参数,具体取决于您想要实现的目标。
基本上,您必须在 "I need one version that needs to be able to modify the passed reference"(当时有 2 个版本)和 "I will never modify the passed reference anyway"(只有 const int&
版本)之间做出选择。
void f(int & i){
cout << "l-value-ref" << endl;
}
void f(int && i){
cout << "r-value-ref" << endl;
}
假设上面的代码,我们有一个重载函数,它分别接受 l-value-reference 和 r-value-reference 参数。
int x = 5;
f(x);
f(5);
const int j = 9;
f(j);
当我使用 const int j = 9 时,编译器给出了歧义错误。我怎么解决这个问题?
您的编译器错误(如果确实是您提到的错误)具有误导性。这里真正错误的是,尝试将 const int
参数传递给任何函数都会丢弃 const
限定符,这是不允许的。您可以通过将签名更改为 const int&
/ const int&&
(请注意 const int&&
仍然无法使用 const int
参数)或通过添加另一个重载来解决它const
个参数,具体取决于您想要实现的目标。
基本上,您必须在 "I need one version that needs to be able to modify the passed reference"(当时有 2 个版本)和 "I will never modify the passed reference anyway"(只有 const int&
版本)之间做出选择。