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,旧的或不符合标准的。你的回答解决了我的问题。非常感谢。