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类型是任意的。返回对 *this
或 void
的引用是常规的。您可以 return int*
或 std::string
。常规方案通常更好。
无法调用已删除的函数,派生其 return 类型的表达式至少是替换失败,因此我认为没有 standard-defined 危害。
编译器可能会或可能不会从 void return 值给出比参考值更差的诊断。为您的编译器比较两种情况下的 a=b=c
情况;关于 "cannot assign from void" 的噪音会让我不喜欢 return 从删除的版本中无效。
Return 类型不是 c++ 中函数签名的一部分(这也是为什么不能仅通过 return 类型重载函数的原因)。所以没关系,因为在名称查找期间仍会找到您删除的函数。不过,您可能会收到编译器警告,具体取决于您的编译器 version/settings.
编译器从选定的重载中推导出 return 类型。如果显式删除重载,则在考虑 return 类型之前编译失败。
在 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类型是任意的。返回对 *this
或 void
的引用是常规的。您可以 return int*
或 std::string
。常规方案通常更好。
无法调用已删除的函数,派生其 return 类型的表达式至少是替换失败,因此我认为没有 standard-defined 危害。
编译器可能会或可能不会从 void return 值给出比参考值更差的诊断。为您的编译器比较两种情况下的 a=b=c
情况;关于 "cannot assign from void" 的噪音会让我不喜欢 return 从删除的版本中无效。
Return 类型不是 c++ 中函数签名的一部分(这也是为什么不能仅通过 return 类型重载函数的原因)。所以没关系,因为在名称查找期间仍会找到您删除的函数。不过,您可能会收到编译器警告,具体取决于您的编译器 version/settings.
编译器从选定的重载中推导出 return 类型。如果显式删除重载,则在考虑 return 类型之前编译失败。