对右值的非常数引用

non-const reference to rvalue

本文关键字:引用 非常      更新时间:2023-10-16

我了解foo(const int& a)的用法。这可以用来调用类似foo(1)的东西,其中foo(int& a)将失败。

现在进行实验,我创建了这个类:

class temp {
public:
    int a;
    temp(int x = 5) : a(x) {}
    void foo_val(temp a) { /* ... */ }
    void foo_ref(temp& a) { /* ... */ }
}; 
void main() {
    temp temp1(6);
    temp1.foo_val(temp1); // foo_val(temp a) is called
    temp1.foo_ref(temp()); // foo_ref (temp& a) is called
}

我不明白的是temp1.foo_ref(temp())为什么能成功。我们怎么能有一个带有右值的引用(在这种情况下是temp())。我原以为只有foo_ref(const temp& a)才能成功。我是不是对右耳值想错了。

我不明白的是temp1.foo_ref(temp())为什么能成功。

根据void main() { ... }的使用判断,您必须有一个旧的或不符合标准的编译器。

temp1.foo_ref(temp());

应该失败。我使用g++4.8.4得到以下错误。

g++ -Wall -std=c++11     socc.cc   -o socc
socc.cc: In function ‘int main()’:
socc.cc:13:22: error: no matching function for call to ‘temp::foo_ref(temp)’
  temp1.foo_ref(temp()); //foo_ref (temp& a) is called
                      ^
socc.cc:13:22: note: candidate is:
socc.cc:6:7: note: void temp::foo_ref(temp&)
  void foo_ref(temp& a){}
       ^
socc.cc:6:7: note:   no known conversion for argument 1 from ‘temp’ to ‘temp&’