默认函数可以返回 auto 吗?

21 c++ language-lawyer

考虑以下类:

class example
{
public:
    auto & operator =(const example &) = default;
    auto & operator =(example &&) = default;
};
Run Code Online (Sandbox Code Playgroud)

这些声明是否合法?

eer*_*ika 17

auto & operator =(const example &) = default;
auto & operator =(example &&) = default;
Run Code Online (Sandbox Code Playgroud)

这些声明是否合法?

不。

[dcl.spec.auto] ...如果函数声明的返回类型包含占位符类型,则函数的返回类型是从函数体中的非丢弃返回语句(如果有的话)推导出来的([stmt 。如果])。

默认函数定义没有主体,这与引用规则相冲突。没有什么可以推导出返回类型,并且没有规则说明在这种情况下该类型是什么。

operator<=>有一个例外规则auto,如Caleth's answer所示,指定何时使用返回类型,但operator=没有这样的规则。我认为没有理由不能引入这样的规则来允许默认赋值运算符中的 auto 。


Cal*_*eth 13

在 C++20 中,是1

R是默认三路比较运算符函数的声明返回类型,让xix类型 C`的对象的子对象扩展列表的元素。

  • 如果Rauto,则让cvi Ri是表达式的类型xi <=> xi。如果该表达式不可用或Ri不是 any 的比较类别类型 ([cmp.categories.pre]),则运算符函数被定义为已删除i。返回类型被推导出为 的通用比较类型(见下文)R0, R1, …, Rn?1

[class.spaceship/2]

在 C++20 之前,否

形式为:attribute-specifier-seq opt decl-specifier-seq opt declarator virt-specifier-seq opt = default ;的函数定义称为显式默认定义。显式默认的函数应

  • 是一个特殊的成员函数,
  • 具有相同的声明函数类型(除了可能不同的 ref 限定符以及在复制构造函数或复制赋值运算符的情况下,参数类型可能是“对非常量的引用T”,其中T是成员函数的名称class) 就好像它已被隐式声明一样,并且

[dcl.fct.def.default] (强调)

  1. 但只有<=>. 默认的==必须 return bool,并且分配具有与以前的标准类似的限制。

ifF是赋值运算符,并且 的返回类型T1不同于T2orT1的参数类型的返回类型不是引用,则程序格式错误;

[dcl.fct.def.default]

  • 您应该说明赋值运算符的大小写是否也发生了变化。也就是说,您应该说*唯一*可以使用 `auto` 的默认函数是否是 `&lt;=&gt;` (4认同)

bol*_*lov 8

不是语言律师的答案

根据我的经验,编译器不接受auto默认特殊成员函数的返回类型,因此我认为标准确实不允许它们。

我所知道的唯一例外是 C++20 默认的三向比较运算符:

#include <compare>

struct X
{
    auto operator<=>(const X&) const = default;
};
Run Code Online (Sandbox Code Playgroud)