c++ 表示不完全和完全类型的注入类名

06odsfpq  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(146)

考虑以下代码片段:

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实际上指的是不同的实体。但是在名称查找过程中(3.4.1,unqualified name lookup)对于A,在//1//2中都可以找到相同的***注入类名***。这很奇怪。
你能解释一下吗
我想从标准中找到一个规范性的引用。

pokxtpni

pokxtpni1#

dyp已经在评论区给出了正确的答案。引用标准:
一个类类型(如“class X”)可能在翻译单元中的某个点不完整,而在稍后完成;类型“class X”在两点处是相同的类型。[...]
这是[基本]。types.general]/6,尽管自C++98以来措辞没有改变。这是《任择议定书》所要求的规范性参考。
OP接着问:
但是完整和不完整的类类型在//1和//2包含不同的成员。我不明白这些类型怎么会是一样的?
他们在 * 身份 * 方面是一样的,就像一个有两条胳膊和两条腿的人,如果他们不幸失去了一只胳膊,那么后来就是同一个人。

相关问题