inject -class-name表示不完整和完整类型

Injected-class-name denoted incomplete and complete type

本文关键字:类型 -class-name 表示 inject      更新时间:2023-10-16

考虑以下代码片段:

class A
{
    void foo(){ A a; }//1.  Ok, because A is complete type here
    int b[A::c];//2. Error, because incomplete type denoted by A does not contain c as a member.
    static const int c = 6;
}

关于这种行为,我假设//1//2中的A实际上指的是不同的实体。但在A的名称查找过程中(3.4.1,非限定名称查找),//1//2都可以找到相同的注入类名称。这很奇怪。

你能解释一下吗?

我想从标准中找到一个规范的参考

dyp已经在评论区给出了正确的答案。引用自标准:

类类型(如"class X ")可能在翻译单元的某个点不完整,然后完成;类型"class X";在两个点都是相同的类型。[…]

这是[basic.types]。尽管自c++ 98以来措辞没有改变,但c++ 20中的general]/6。这是OP要求的标准引用。

OP接着问:

但是//1和//2处的完整和不完整类类型包含不同的成员。我不明白这些类型怎么可能是一样的?

它们在身份方面是相同的,就像一个有两条胳膊和两条腿的人,如果他不幸失去了一条胳膊,那么他后来还是同一个人。