请看这个简单的C++代码。
// rrlv1.cpp
#include <utility>
class CInt {
public: int mi;
};
void rrlv(CInt&& iobj) {
int old = iobj.mi;
iobj.mi = 4;
}
int main() {
CInt i1{1};
rrlv(i1); // compile ERROR, should use std::move(i1)
return 0;
}
这是错误的代码,但编译器错误消息很有趣。
海合会第十二届会议:
rrlv1.cpp:13:15: error: cannot bind rvalue reference of type ‘CInt&&’ to lvalue of type ‘CInt’
13 | rrlv0(i1);
| ^~
rrlv1.cpp:6:19: note: initializing argument 1 of ‘void rrlv0(CInt&&)’
6 | void rrlv0(CInt&& iobj) {
| ~~~~~~~^~~~
Visual C++ 2019年11月16日:
rrlv1.cpp(13): error C2664: 'void rrlv0(CInt &&)': cannot convert argument 1 from 'CInt' to 'CInt &&'
rrlv1.cpp(13): note: You cannot bind an lvalue to an rvalue reference
然后我困惑了,它是“绑定变量/参数名到表达式",还是相反?
如果这一点不清楚,我想会给新手造成巨大的困惑,甚至会造成老兵之间沟通的混乱。
哪种表达方法是正确的(被大多数人接受)?
1条答案
按热度按时间rbpvctlc1#
如果你看一下under the section on initializing references标准,它几乎总是谈到绑定到值类别的对象/表达式的某种引用,所以从标准的Angular 来看,GCC更准确。
然而,如果你真的查找任何不刻意模仿C++标准措辞的东西,每个人都在谈论绑定到某种引用的值类别的对象/表达式。这是人们通常谈论它的方式,特别是关于右值引用的重载解析(即:此表达式是否可以绑定到右值引用)。