[英]How do “const”, “&”, and “&&” affect overloading of a parameterless function?
考慮定義如下的類:
struct A
{
void f();
void f() const;
void f() &;
void f() const &;
void f() &&;
void f() const &&;
};
之間有什么區別?
1)無效A :: f(); 並無效A :: f()&; (請注意這一點!)
2)void A :: f()const; 並無效A :: f()const&;
3)無效A :: f()&&; 和無效的A :: f()const &&;
您可以將它們轉換為
void f(A&);
void f(const A&);
void f(A&);
void f(const A&);
void f(A&&) &&;
void f(const A&&);
第一個是特殊的-它是A&
, 但是仍然接受rvalue ,這與其他非常量lvalue引用不同。 在所有其他方面,它與帶有A&
參數的任何其他函數相同。
第二個( const
)和第四個( const&)
之間的重載分辨率沒有區別,除非它們分別與( &&
)競爭。 我認為普通函數不會發生這種情況,而是轉換函數會發生這種情況,因為標准禁止這種情況(通常,如果當前作用域中有任何帶有ref限定符的函數,則所有函數都必須)
void f();
void f() &&;
但是,使用轉換函數,您仍然可以同時設置operator int()
和operator long()&&
的重載分辨率。 在那種情況下,即使調用它們的對象是R()
(一個右值),如果您需要轉換為int
,也將使用第一個轉換函數。
f()
為正常功能f() const
, this
必須指向可修改lval中 f() const
是const函數(無法更改) f() const &
相同,但也保證這也是lval f()&&
這必須是f() const &&
的臨時值f() const &&
這必須是您不能修改的臨時值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.