【问题标题】:Can one delete a function returning an incomplete type in C++?可以删除在 C++ 中返回不完整类型的函数吗?
【发布时间】:2022-01-21 09:42:52
【问题描述】:

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

struct A;
A f() = delete;

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

error: incomplete result type 'A' in function definition

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

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

【问题讨论】:

标签: c++ language-lawyer incomplete-type deleted-functions


【解决方案1】:

Clang 是错误的。

[dcl.fct.def.general]

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

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

当然,parameter 类型在实际重载决议的情况下更有趣(返回类型可以是任何东西),但这里也没有理由将返回类型限制为完整.

【讨论】:

    【解决方案2】:

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

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

    提出了defect report,随后提出并追溯应用了一项决议(强调我的):

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

    因此,Clang 是错误的。

    【讨论】:

    • C++11 的原始版本有这个 bug,几个月后就修复了。如此古老的消息,虽然还不是古老的。不过,值得注意的是,它完全适用于发现的编译器错误。
    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多