可以在ref限定符上明确默认/删除函数重载吗?

Nik*_*iou 6 c++ c++11

介绍

  • Ref限定符:一种消除隐含对象的rl-valuness的方法.作为一个简单的例子,请参加以下课程

    class example
    {
      int member;
    public:
      // ...
      int&       value() &;
      //                 ^
      int&&      value() &&;
      //                 ^^
      int const& value() const&;
      //                      ^
    };
    
    Run Code Online (Sandbox Code Playgroud)

    使用这个C++ 11特性(标^有的语法),允许我们控制value()将被调用的版本

    • 左值
    • 临时工
    • 常数值

    实际上,参考资格适用于classe *this

  • 默认/删除函数:指定特殊成员函数,使其具有编译器生成(默认)定义或不可访问(删除).举个例子吧

    struct type {
      type(const type&)            = delete;
      type& operator=(const type&) = delete;
    };
    
    Run Code Online (Sandbox Code Playgroud)

    上面的结构实现了非可复制的非常清晰的语义

问题

  • 结合这些功能是否可行/有效?
  • 哪些是明确被禁止不好的风格
  • 这种组合是否有任何用例/模式?(例如,快速简便地创建基于rl值的条件接口)

eca*_*mur 4

是的,但是没有多大用处,因为构造函数和析构函数不能被引用限定。

您可以引用限定赋值运算符:

struct S {
  S &operator=(const S &) && = default;
};

int main() {
  S s;
  S() = s;  // OK
  s = S();  // error - LHS must be an rvalue
}
Run Code Online (Sandbox Code Playgroud)

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

  • 由于您可以`=删除`几乎任何内容,这对于清除错误消息非常有用(而不是“未找到过载”)。 (4认同)