默认函数可以返回自动吗?

Can a default function return auto?

本文关键字:返回 函数 默认      更新时间:2023-10-16

考虑以下类:

class example
{
public:
auto & operator =(const example &) = default;
auto & operator =(example &&) = default;
};

这些声明是否合法?

auto & operator =(const example &) = default;
auto & operator =(example &&) = default;

这些声明是否合法?

不。

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

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

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

在 C++20 中,是1

R默认三向的声明返回类型 比较运算符函数,并让xi成为 类型为 C' 的对象x的子对象的展开列表。

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

[class.spaceship/2]

在C++20之前,没有

表单的函数定义:属性-说明符-seq opt decl-specifier-seq opt declarator virt-specifier-seq opt= default ;称为显式默认定义。一个函数,即 明确违约应

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

[dcl.fct.def.default](着重号后加(

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

如果F是赋值运算符,并且返回类型不同T1从返回类型T2T1的参数类型不是 参考,程序格式不正确;

[dcl.fct.def.default]

不是语言律师的答案

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

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

#include <compare>
struct X
{
auto operator<=>(const X&) const = default;
};