"const"、"&" 和 "&&"如何影响无参数函数的重载?

How do "const", "&", and "&&" affect overloading of a parameterless function?

本文关键字:参数 函数 重载 const 何影响 影响      更新时间:2023-10-16

考虑一个定义如下的类:

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

两者之间有什么区别:

1) 无效 A::f(

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

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

3) 无效 A::f() &&;和无效 A::f() 常量 &&;

您可以将这些转换为

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

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

第二个(const)和第四个(const&))之间的过载分辨率没有区别,除非它们分别与一个(&&竞争)。我不认为普通函数会发生这种情况,而只会发生在转换函数上,因为标准禁止这种情况(一般来说,如果当前范围内有任何带有 ref 限定符的函数,则所有函数都必须)

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

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

  1. f()f() const的正常函数,this必须指向可修改的 lval
  2. f() const是一个常量函数(无法更改),f() const &是相同的,但保证这也是一个 lval
  3. f()&&这必须是 的临时值,f() const && 这必须是您无法修改的临时值