C++ 使用声明初始化或枚举

C++ 使用声明初始化或枚举,c++,class,enumeration,using,language-lawyer,C++,Class,Enumeration,Using,Language Lawyer,N3797第3.4.3.1/1节的开头说: 如果限定id的嵌套名称说明符指定类,则 在中查找嵌套名称说明符后指定的名称 类别(10.2)的范围,下列情况除外 其中一条规则是: 查找using声明(7.3.3)中指定的名称也包括在内 查找隐藏在同一范围内的类或枚举名称 (3.3.10) 你能举个例子来说明这个规则吗?我相信这就是标准所提供的: struct A { struct s {} s; enum e { e }; }; struct B: A { using A::s; u

N3797第3.4.3.1/1节的开头说:

如果限定id的嵌套名称说明符指定类,则 在中查找嵌套名称说明符后指定的名称 类别(10.2)的范围,下列情况除外

其中一条规则是:

查找using声明(7.3.3)中指定的名称也包括在内 查找隐藏在同一范围内的类或枚举名称 (3.3.10)


你能举个例子来说明这个规则吗?

我相信这就是标准所提供的:

struct A {
  struct s {} s;
  enum e { e };
};
struct B: A {
  using A::s;
  using A::e;
};
struct B::s s2;
enum B::e e2;
B
范围内的using声明将类和枚举名
A::s
A::e
带入范围,即使它们分别被成员和枚举数隐藏


注意,using声明还将成员和枚举数引入范围,因此类和枚举仍然隐藏在
B
的范围内;这意味着要在
B
或其他地方使用它们,我们需要使用
struct
enum
标记。

在下面的代码
B::mus
中隐藏
A::mus
C
中。但是可以通过
使用A::m_s
直接访问它

要查看差异,请注释using指令

#包括
#包括
结构A{
std::字符串m_s;
A():
m_s(“我是A::m_s”)
{}
};
结构B:A{
std::字符串m_s;
B():
m_s(“我是B::m_s”)
{}
};
结构C:B{
使用A::mu s;
};
int main(){
C C;

std::难道我不认为是这样吗,使用A::{s,e}
B
中删除
,该片段仍然是合法的,因为
[class.member.lookup]p5
(声明如果派生中没有引入名称,则搜索基).或者这就是整节的重点,不做使用声明,忘记了基础中的其他名称?