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

Can one delete a function returning an incomplete type in C++?

提问人:Fedor 提问时间:12/19/2021 最后编辑:CinCoutFedor 更新时间:12/19/2021 访问量:2631

问:

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

struct A;
A f() = delete;

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

error: incomplete result type 'A' in function definition

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

根据标准,哪个编译器在这里?

C++ 语言 - 律师 不完整类型 删除函数

评论

0赞 Language Lawyer 12/19/2021
这回答了你的问题吗?是否需要诊断不完整类型的用法?
0赞 Fedor 12/21/2021
感谢您的参考。这是一个非常广泛的问题,但人们可以在那里找到答案。

答:

32赞 StoryTeller - Unslander Monica 12/19/2021 #1

咔嚓咔嚓错了。

[dcl.fct.def.general]

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

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

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

24赞 CinCout 12/19/2021 #2

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

函数定义的参数类型或返回类型 不得是不完整的类类型(可能是 CV 合格的),除非 函数定义嵌套在 该类(包括 类)。

提出了缺陷报告,随后提出了一项决议,并追溯性地应用了该决议(强调我的):

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

因此,Clang 是错误的。

评论

0赞 Deduplicator 12/21/2021
C++11的原始版本有这个错误,几个月后就得到了修复。因此,旧新闻,虽然还不古老。不过,值得注意的是,它完全适用于发现的编译器错误。