在 C++ 中可以删除返回不完整类型的函数吗?

Fed*_*dor 43 c++ language-lawyer deleted-functions incomplete-type

在以下示例中,f()返回不完整类型的函数A被标记为已删除:

struct A;
A f() = delete;
Run Code Online (Sandbox Code Playgroud)

它被 GCC 接受,但不被 Clang 接受,Clang 抱怨道:

error: incomplete result type 'A' in function definition
Run Code Online (Sandbox Code Playgroud)

演示: https: //gcc.godbolt.org/z/937PEz1h3

根据标准,哪个编译器是正确的?

Sto*_*ica 32

叮当错了。

[dcl.fct.def.一般]

2函数定义的参数类型或返回类型不应是函数体内不完整或抽象的(可能是 cv 限定的)类类型,除非该函数被删除([dcl.fct.def.delete] )。

我认为这很清楚。删除的定义会导致类类型不完整。这并不是说该函数实际上可以在格式良好的程序中调用,或者主体实际上以某种方式使用不完整的类型。该函数是一个占位符,表示重载解析的结果无效。

诚然,在实际重载解析的情况下,参数类型更有趣(并且返回类型可以是任何类型),但也没有理由限制返回类型在这里是完整的。


Cin*_*out 24

一开始,9.3.4.6 [dcl.fct] 第 9 段要求

函数定义的参数类型或返回类型不应是不完整的类类型(可能是 cv 限定的),除非函数定义嵌套在该类的成员规范中(包括该类中定义的嵌套类中的定义) )。

提出了缺陷报告,并提出了后续决议并追溯应用(强调我的):

不得在返回类型或参数类型中定义类型。函数定义的参数类型或返回类型不应是不完整的类类型(可能是 cv 限定的),除非函数被删除 (9.5.3 [dcl.fct.def.delete])或定义是嵌套的在该类的成员规范中(包括在该类中定义的嵌套类中的定义)。

因此,Clang是错误的。