请考虑以下类:
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=
没有这样的规则。 我看不出有什么理由不能引入这样的规则来允许在默认的赋值运算符中使用auto。
让r
是默认三向比较运算符函数的声明返回类型,让xi
是C`类型的对象x
的子对象扩展列表的元素。
r
是auto
,则让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;
的函数定义称为显式默认定义。 明确默认的函数应
t
”,其中t
是成员函数的类的名称),就像它已经被隐式声明一样,并且[dcl.fct.def.default]
(着重号后加)
<=>
。 默认的==
必须返回bool
,并且赋值具有与以前标准类似的限制。如果F
是赋值运算符,且T1
的返回类型与T2
的返回类型不同,或者T1
的参数类型不是引用,则程序格式错误;
[dcl.fct.def.default]
不是语言律师回答
根据我的经验,编译器不接受默认特殊成员函数的auto
返回类型,因此我假设它们确实是标准不允许的。
我知道的唯一例外是C++20默认的三向比较运算符:
#include <compare>
struct X
{
auto operator<=>(const X&) const = default;
};