以下代码有效吗?
struct A
{
struct nested;
};
struct B : public A {};
struct B::nested {};
gcc 接受它,但 clang 拒绝它并出现以下错误:
test.cpp:8:14: error: no struct named 'nested' in 'B'
class B::nested {};
~~~^
以下代码有效吗?
struct A
{
struct nested;
};
struct B : public A {};
struct B::nested {};
gcc 接受它,但 clang 拒绝它并出现以下错误:
test.cpp:8:14: error: no struct named 'nested' in 'B'
class B::nested {};
~~~^
是的,无效。这是报价单。
第 9 节第 11 段,强调我的:
如果一个类头名称包含一个嵌套名称说明符,则该类说明符应引用先前直接在嵌套名称说明符所指的类或命名空间中声明的类,或者在该命名空间的内联命名空间集(7.3.1)(即,不仅仅是由using-declaration继承或引入),并且类说明符应出现在包含先前声明的命名空间中。在这种情况下,定义的class-head-name的nested-name-specifier不应以decltype-specifier开头。
在您的示例中,class-head-name是 tokens B::nested
,它包括nested-name-specifier B::
和class-name nested
。类说明符是整个struct B::nested {
... }
。
B 没有名为 的嵌套类nested
。只有 A 有一个名为的嵌套类nested
class A::nested { };
应该可以正常工作
您继承自,A
因此您不会将nested
struct 封装在B
.
从创建的类型的结构B
你只能到达结构命名nested
,因为它是结构的一部分B
,但是构造结构命名nested
是负责任A
的,因为它被封装了nested
。
总而言之,您的代码无效。