C++ 成员函数在声明后用 & 或 && 标记 - 这是什么意思?

问题描述 投票:0回答:1
我知道 C++ 类定义中的成员函数签名可以附加

const

 - 我认为这是保证该方法不会更改对象(的不可变成员)。而且我还知道我们可以附加 
noexcept
 来保证该方法不会抛出异常。

我最近偷看了一些图书馆,发现一些班级成员在签名末尾带有

&

&&
 ;我不熟悉。当然,我知道 
&
&&
 用于标记参考文献。但是 - 它们在成员函数签名末尾意味着什么?

c++ c++11 reference member-functions method-signature
1个回答
0
投票
实际上,

&

&&
标记与
const
标记非常相似 - 但与您感知的方式不完全一样。

简介#1:左值与右值参考

首先,确保您知道什么是右值引用 (

&&

),而不是左值引用 (
&
)。参见:

    关于右值与左值的
  • StackOverflow问题
  • 有关左值和右值引用的
  • cppreference 页面
简介 #2:成员函数和对对象的隐式引用

假设你正在编写该方法

int MyClass::foo(int x)
在该方法中,您可以引用参数 

x

,也可以引用调用成员函数的对象:如果您调用 
my_obj.foo(my_var)
,则在 
foo
 的主体中,您可以引用 
my_obj
 隐式定义的对象(我们称之为 
this_obj_ref
);每当在 
foo()
 的实现中,您使用 MyClass 的成员(例如 
MyClass::bar
)时,您实际上是在告诉编译器使用 
this_obj_ref.bar

(另外,this

是你的对象的地址;但出于某种原因,我没有用`this来解释上面的内容。)

因此,我们可以将该方法视为一个独立的函数,其签名为:

int MyClass_foo(MyClass& this_obj_ref, int x)
成员函数的限定符 = 隐式对象引用的限定符

实际上,上面的虚签名并不是在任意函数中获取 MyClass 对象引用的唯一可能性。可能是:

    左值引用或右值引用
  • const 合格与否
  • 是否符合 挥发性标准
成员函数声明末尾的额外限定符实际上限定了调用该方法所用的

this_object_ref

 隐式参数。

所以,

int MyClass::foo(int x) const

意味着该方法将像这样被调用:

int MyClass_foo(MyClass const & this_obj_ref, int x)
这意味着无论 

my_obj

 是否为常量 MyClass 对象,您都可以使用它;而原始的 
foo
 仅当 
my_obj
 是非常量时才能使用。

如果我们使用

&

&&
,我们表明该方法只能与 
lvalue vs rvalue 引用一起使用:

签名调用相当于调用
int MyClass::foo(int x) &

int MyClass_foo(MyClass & this_obj_ref, int x)

int MyClass::foo(int x) &&

int MyClass_foo(MyClass && this_obj_ref, int x)

如果没有限定条件,就好像两个成员函数都存在但具有相同的函数体。

© www.soinside.com 2019 - 2024. All rights reserved.