考虑以下类:
class example
{
public:
auto & operator =(const example &) = default;
auto & operator =(example &&) = default;
};
Run Code Online (Sandbox Code Playgroud)
这些声明是否合法?
eer*_*ika 17
Run Code Online (Sandbox Code Playgroud)auto & operator =(const example &) = default; auto & operator =(example &&) = default;
这些声明是否合法?
不。
[dcl.spec.auto] ...如果函数声明的返回类型包含占位符类型,则函数的返回类型是从函数体中的非丢弃返回语句(如果有的话)推导出来的([stmt 。如果])。
默认函数定义没有主体,这与引用规则相冲突。没有什么可以推导出返回类型,并且没有规则说明在这种情况下该类型是什么。
operator<=>
有一个例外规则auto
,如Caleth's answer所示,指定何时使用返回类型,但operator=
没有这样的规则。我认为没有理由不能引入这样的规则来允许默认赋值运算符中的 auto 。
Cal*_*eth 13
让
R
是默认三路比较运算符函数的声明返回类型,让xi
是x
类型 C`的对象的子对象扩展列表的元素。
- 如果
R
是auto
,则让cvi Ri
是表达式的类型xi <=> xi
。如果该表达式不可用或Ri
不是 any 的比较类别类型 ([cmp.categories.pre]),则运算符函数被定义为已删除i
。返回类型被推导出为 的通用比较类型(见下文)R0, R1, …, Rn?1
。
形式为:attribute-specifier-seq opt decl-specifier-seq opt declarator virt-specifier-seq opt
= default ;
的函数定义称为显式默认定义。显式默认的函数应
- 是一个特殊的成员函数,
- 具有相同的声明函数类型(除了可能不同的 ref 限定符以及在复制构造函数或复制赋值运算符的情况下,参数类型可能是“对非常量的引用
T
”,其中T
是成员函数的名称class) 就好像它已被隐式声明一样,并且
<=>
. 默认的==
必须 return bool
,并且分配具有与以前的标准类似的限制。if
F
是赋值运算符,并且 的返回类型T1
不同于T2
orT1
的参数类型的返回类型不是引用,则程序格式错误;
不是语言律师的答案
根据我的经验,编译器不接受auto
默认特殊成员函数的返回类型,因此我认为标准确实不允许它们。
我所知道的唯一例外是 C++20 默认的三向比较运算符:
#include <compare>
struct X
{
auto operator<=>(const X&) const = default;
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1237 次 |
最近记录: |