提问者:小点点

默认函数可以返回auto吗?


请考虑以下类:

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

这些声明是否合法?


共3个答案

匿名用户

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

这些声明是否合法?

不。

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

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

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

匿名用户

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

  • 如果rauto,则让CVI RI为表达式xi<=>的类型; XI。 如果表达式不可用,或者如果RI不是任何I的比较类别类型([CMP.Categories.pre]),则运算符函数定义为删除。 返回类型被推导为R0,R1,…,rn−1
  • 的常见比较类型(见下文)

[class.spaceship/2]

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

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

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

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

如果F是赋值运算符,且T1的返回类型与T2的返回类型不同,或者T1的参数类型不是引用,则程序格式错误;

[dcl.fct.def.default]

匿名用户

不是语言律师回答

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

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

#include <compare>

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