可以显式默认/删除的函数在 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++中父类和子类的成员函数同名同参数同返回只是父类里面是虚函数,子类没有虚函数限定 有问题吗

ref的使用

我可以在同一个套接字描述符上调用 bind() 然后 connect() 吗?

C++类和对象中