【问题标题】:Can explicitly defaulted / deleted functions overload on ref qualifiers?可以显式默认/删除的函数在 ref 限定符上重载吗?
【发布时间】: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 的条件接口)

【问题讨论】:

标签: c++ c++11


【解决方案1】:

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

您可以重新限定赋值运算符:

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

int main() {
  S s;
  S() = s;  // OK
  s = S();  // error - LHS must be an rvalue
}

但是,我有点茫然地想象这会有什么用处。

【讨论】:

  • 因为你可以= delete 几乎任何东西,这对于清除错误消息非常有用(而不是“未找到重载”)。
猜你喜欢
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多