C++ 对右值的非常量引用

C++ 对右值的非常量引用,c++,constants,C++,Constants,我了解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

我了解
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\u 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&’
我不明白的是为什么
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&’

应该这样。你在用哪个编译器?哪个编译器?Visual Studio有一个非标准的扩展来允许这种代码,请参阅和。@songyuanyao VS 2015。@JamesAdkison谢谢。从来没想过这会是一只虫子。@ArulMoondra:不应该。你在用哪个编译器?哪个编译器?Visual Studio有一个非标准的扩展来允许这种代码,请参阅和。@songyuanyao VS 2015。@JamesAdkison谢谢。从未想过这会是一个bug。@ArulMoondra:It's notVS 2015很难算是“老的”。@BarryTheHatchet,老的或不符合标准的。你的答案解决了我的问题。谢谢。VS 2015并不是“老的”。@BarryTheHatchet,旧的或不符合标准的。你的回答解决了我的问题。非常感谢。