C++命名法,将谁绑定到谁?

yrdbyhpb  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(157)

请看这个简单的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

然后我困惑了,它是“绑定变量/参数名表达式",还是相反?
如果这一点不清楚,我想会给新手造成巨大的困惑,甚至会造成老兵之间沟通的混乱。
哪种表达方法是正确的(被大多数人接受)?

rbpvctlc

rbpvctlc1#

如果你看一下under the section on initializing references标准,它几乎总是谈到绑定到值类别的对象/表达式的某种引用,所以从标准的Angular 来看,GCC更准确。
然而,如果你真的查找任何不刻意模仿C++标准措辞的东西,每个人都在谈论绑定到某种引用的值类别的对象/表达式。这是人们通常谈论它的方式,特别是关于右值引用的重载解析(即:此表达式是否可以绑定到右值引用)。

相关问题