考虑以下代码片段:
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
中都可以找到相同的***注入类名***。这很奇怪。
你能解释一下吗
我想从标准中找到一个规范性的引用。
1条答案
按热度按时间pokxtpni1#
dyp已经在评论区给出了正确的答案。引用标准:
一个类类型(如“
class X
”)可能在翻译单元中的某个点不完整,而在稍后完成;类型“class X
”在两点处是相同的类型。[...]这是[基本]。types.general]/6,尽管自C++98以来措辞没有改变。这是《任择议定书》所要求的规范性参考。
OP接着问:
但是完整和不完整的类类型在//1和//2包含不同的成员。我不明白这些类型怎么会是一样的?
他们在 * 身份 * 方面是一样的,就像一个有两条胳膊和两条腿的人,如果他们不幸失去了一只胳膊,那么后来就是同一个人。