可以显式默认/删除ref限定符上的函数重载

Can explicitly defaulted / deleted functions overload on ref qualifiers?

本文关键字:重载 函数 ref 默认 删除      更新时间:2023-10-16

INTRO

  • Ref限定符:一种消除隐含对象的rl值歧义的方法。作为一个快速的例子,以下面的类为例

    class example
    {
      int member;
    public:
      // ...
      int&       value() &;
      //                 ^
      int&&      value() &&;
      //                 ^^
      int const& value() const&;
      //                      ^
    };
    

    使用这个C++11特性(用^标记的语法(,可以控制将用调用的value()的版本

    • l值
    • 临时
    • 常量l值

    实际上,裁判资格适用于该级别的*this

  • 默认/删除的函数:将特殊成员函数指定为具有编译器生成的(缺省(定义或不可访问(delete。以为例

    struct type {
      type(const type&)            = delete;
      type& operator=(const type&) = delete;
    };
    

    上述结构,实现了不可复制,具有极其清晰的语义

问题

  • 是否可以组合这些功能
  • 哪些情况下被明确禁止风格不好
  • 对于这样的组合,是否有用例/模式?(例如,创建基于rl值的条件接口既快捷又简单(

是的,但没有太多用处,因为构造函数和析构函数不能进行ref限定。

您可以引用合格的分配运算符:

struct S {
  S &operator=(const S &) && = default;
};
int main() {
  S s;
  S() = s;  // OK
  s = S();  // error - LHS must be an rvalue
}

然而,我有点不知所措,无法想象这会有什么用处。