默认函数可以返回自动吗?
Can a default function return auto?
考虑以下类:
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
的子对象的展开列表。
- 如果
R
是auto
,则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]
(着重号后加(
- 但只有
<=>
.默认的==
必须返回bool
,并且赋值具有与以前的标准类似的限制。
如果
F
是赋值运算符,并且返回类型不同T1
从返回类型T2
或T1
的参数类型不是 参考,程序格式不正确;
[dcl.fct.def.default]
不是语言律师的答案
根据我的经验,编译器不接受默认特殊成员函数auto
返回类型,因此我认为标准确实不允许它们。
我知道的唯一例外是 C++20 默认的三向比较运算符:
#include <compare>
struct X
{
auto operator<=>(const X&) const = default;
};
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数