可以显式默认/删除的函数在 ref 限定符上重载吗?
Posted
技术标签:
【中文标题】可以显式默认/删除的函数在 ref 限定符上重载吗?【英文标题】:Can explicitly defaulted / deleted functions overload on ref qualifiers? 【发布时间】:2014-06-04 13:13:48 【问题描述】:简介
Ref qualifiers :一种消除隐含对象的 rl 值歧义的方法。举个简单的例子,下面这个类
class example
int member;
public:
// ...
int& value() &;
// ^
int&& value() &&;
// ^^
int const& value() const&;
// ^
;
使用这个 C++11 特性(用^
标记的语法),允许我们控制将被调用的value()
的版本
实际上,裁判资格适用于班级的*this
Defaulted / Deleted functions :指定一个特殊成员函数,使其具有编译器生成(默认)定义或不可访问(删除)。以
为例struct type
type(const type&) = delete;
type& operator=(const type&) = delete;
;
上述结构,实现了不可复制,语义极其清晰
问题
结合这些功能是否可能/有效? 明确禁止或不良风格有哪些情况? 这种组合是否有任何用例/模式? (例如,快速轻松地创建基于 rl-valueness 的条件接口)【问题讨论】:
有些相关:***.com/questions/20886466/… 【参考方案1】:是的,但是没有太多用处,因为构造函数和析构函数不能被引用限定。
您可以重新限定赋值运算符:
struct S
S &operator=(const S &) && = default;
;
int main()
S s;
S() = s; // OK
s = S(); // error - LHS must be an rvalue
但是,我有点茫然地想象这会有什么用处。
【讨论】:
因为你可以= delete
几乎任何东西,这对于清除错误消息非常有用(而不是“未找到重载”)。以上是关于可以显式默认/删除的函数在 ref 限定符上重载吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 RValue 对象上调用 LValue ref 限定成员函数
using 声明能否仅引用基于 const 限定的特定重载?
C++中父类和子类的成员函数同名同参数同返回只是父类里面是虚函数,子类没有虚函数限定 有问题吗