对rvalue的非const引用

时间:2016-03-28 03:40:48

标签: c++ const

我理解使用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)成功。我是否错误地考虑了右值。

1 个答案:

答案 0 :(得分:3)

  

我不明白为什么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&’