1

考虑一个定义如下的类:

struct A
{
    void f();
    void f() const;
    void f() &;
    void f() const &;
    void f() &&;
    void f() const &&;
};

有什么区别:

1) 无效 A::f(); 和 void A::f() &; (请注意这一点!)

2) 无效 A::f() 常量;和 void A::f() const &;

3) 无效 A::f() &&; 和 void A::f() const &&;

4

2 回答 2

2

您可以将这些转换为

void f(A&);
void f(const A&);

void f(A&);
void f(const A&);
void f(A&&) &&;
void f(const A&&);

第一个是特殊的 - 它是 a A&但仍然接受 rvalues,这与其他非常量左值引用不同。在所有其他方面,它与任何其他带有A&参数的函数相同。

const第二个 ( ) 和第四个 ( )之间的重载解决方案没有区别const&),除非它们分别与 ( &&) 竞争。我认为普通函数不会发生这种情况,但仅限于转换函数,因为标准禁止这样做case (一般来说,如果当前作用域中有任何函数带有 ref 限定符,则所有函数都必须)

void f();
void f() &&;

但是使用转换函数,您仍然可以使用operator int()和设置重载分辨率operator long()&&。在这种情况下,即使调用它们的对象是R()(右值),如果您需要转换为,int则将使用第一个转换函数。

于 2013-09-13T17:56:04.337 回答
1
  1. f()是 的正常函数f() constthis必须指向可修改的 lval
  2. f() const是一个 const 函数(不能改变这个)f() const &是相同的,但保证这也是一个 lval
  3. f()&&this 必须是临时值f() const &&this 必须是您无法修改的临时值
于 2013-09-13T02:15:03.923 回答