[英]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.