【问题标题】:return type of deleted functions in c++11c++11中已删除函数的返回类型
【发布时间】:2017-06-20 16:05:26
【问题描述】:

在 c++ 11 中,我们可以使用 delete 禁用复制构造函数和赋值运算符:

class A {
  A(const A&) = delete;
  A& operator=(const A&) = delete;
}

有一天,我的同事使用 void 返回类型而不是引用。

class A {
  A(const A&) = delete;
  void operator=(const A&) = delete;
}

这个也可以吗?

例如,如果我有

A a, b, c;
a = b = c;

这行得通吗?

【问题讨论】:

  • 不明白为什么。函数重载由参数类型而不是返回类型选择。
  • 如果“工作”的意思是“让编译器拒绝编译,因为你正在使用已删除的函数”,那么是的。
  • 是的。编译器会根据参数类型/签名而不是返回类型删除函数吗?换句话说,编译器会删除“WHATEVER operator=(const A&)”?

标签: c++ c++11 overloading assignment-operator


【解决方案1】:

编译器从选定的重载中推断返回类型。如果显式删除重载,则在考虑返回类型之前编译会失败。

【讨论】:

    【解决方案2】:

    返回类型不是 c++ 中函数签名的一部分(这也是您不能仅通过返回类型重载函数的原因)。所以没关系,因为在名称查找期间仍会找到您删除的函数。不过,您可能会收到编译器警告,具体取决于您的编译器版本/设置。

    【讨论】:

      【解决方案3】:

      operator= 的返回类型是任意的。返回对*thisvoid 的引用是常规的。您可以返回int*std::string。传统的解决方案通常更好。

      无法调用已删除的函数,派生其返回类型的表达式至少是替换失败,因此我认为没有标准定义的危害。

      编译器可能会或可能不会从 void 返回值给出比参考值更差的诊断。比较您的编译器的两种情况下的a=b=c 情况;关于“无法从 void 分配”的噪音会让我不喜欢从已删除的版本中返回 void。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 2016-07-27
        • 1970-01-01
        • 2014-11-24
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多