Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 显式默认/删除的函数能否在ref限定符上重载? 简介_C++_C++11 - Fatal编程技术网

C++ 显式默认/删除的函数能否在ref限定符上重载? 简介

C++ 显式默认/删除的函数能否在ref限定符上重载? 简介,c++,c++11,C++,C++11,:一种消除隐含对象的rl值的方法。作为一个简单的例子,以下面的课程为例 class example { int member; public: // ... int& value() &; // ^ int&& value() &&; // ^^ int const& value() const&; //

:一种消除隐含对象的rl值的方法。作为一个简单的例子,以下面的课程为例

class example
{
  int member;
public:
  // ...
  int&       value() &;
  //                 ^
  int&&      value() &&;
  //                 ^^
  int const& value() const&;
  //                      ^
};
使用此C++11功能(语法标记为
^
),允许我们控制将使用调用的
value()
的版本

  • l值
  • 临时工
  • 常数l值
实际上,ref资格认证适用于船级社的
*本

  • :将特殊成员函数指定为已生成编译器(默认值)定义或无法访问(删除)。例如

    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
    }
    

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

    因为你几乎可以删除任何东西,这对于清除错误消息(而不是“未找到重载”)非常有用。有些相关: