return c++11 中删除函数的类型

return type of deleted functions in c++11

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

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

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

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

这个也可以吗?

例如,如果我有

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

这行得通吗?

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

无法调用已删除的函数,派生其 return 类型的表达式至少是替换失败,因此我认为没有 standard-defined 危害。

编译器可能会或可能不会从 void return 值给出比参考值更差的诊断。为您的编译器比较两种情况下的 a=b=c 情况;关于 "cannot assign from void" 的噪音会让我不喜欢 return 从删除的版本中无效。

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

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