C++ 使用声明初始化或枚举
N3797第3.4.3.1/1节的开头说: 如果限定id的嵌套名称说明符指定类,则 在中查找嵌套名称说明符后指定的名称 类别(10.2)的范围,下列情况除外 其中一条规则是: 查找using声明(7.3.3)中指定的名称也包括在内 查找隐藏在同一范围内的类或枚举名称 (3.3.10)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
你能举个例子来说明这个规则吗?我相信这就是标准所提供的:
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
(声明如果派生中没有引入名称,则搜索基).或者这就是整节的重点,不做使用声明,忘记了基础中的其他名称?