在非成员函数上使用delete有什么意义?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (20)

摘自标准20.12 [function.objects]:

template <class T> reference_wrapper<T> ref(T&) noexcept;
template <class T> reference_wrapper<const T> cref(const T&) noexcept;
template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;

我习惯于在成员函数的背景下看到=delete。目的是禁止编译器提供的操作。例如,使类不可复制或不可移动。这是正确的吗?有没有其他情况下使用=delete非成员函数是可取的,可取的还是不可避免的?

提问于
用户回答回答于

一个有用的功能const是临时可以绑定到引用const。代码:

void foo(const int& );
foo(42); // ok

现在,考虑一下std::cref()。目标是把它reference_wrapper传递到某个地方。代码:

template <class T>
reference_wrapper<const T> cref(const T&) noexcept;

然后我可以写std::cref(42)。这将工作得很好,我会收到一个返回——std::reference_wrapper<const int>。该代码无法工作。

为了解决这个明显的错误,我们也有这样的代码:

template <class T> void cref(const T&&) = delete;

也就是说,我们明确地删除(或定义为删除)重载任何右值。现在,当进行重载解析时,当我传递一个右值时,第二个重载是首选,并且重载是不合格的,编译器会通知我们我们的错误。

所属标签

可能回答问题的人

  • 天使的炫翼

    15 粉丝531 提问35 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    48 粉丝0 提问27 回答
  • 富有想象力的人

    2 粉丝0 提问26 回答
  • 发条丶魔灵1

    6 粉丝525 提问25 回答

扫码关注云+社区

领取腾讯云代金券