В начале 3.4.3.1/1 N3797 сказано:
Если спецификатор вложенного имени квалифицированного идентификатора назначает класс,
имя, указанное после поиска спецификатора вложенного имени в
область применения класса (10.2), за исключением случаев, перечисленных ниже.
и одно из этих правил:
поиск имени, указанного в объявлении использования (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;
используя декларированиеS в объеме B
ввести в сферу имена классов и перечислений A::s
а также A::e
даже если они скрыты участником и перечислителем соответственно.
Обратите внимание, что используя декларированиеs также привносит в область действия член и перечислитель, поэтому класс и перечисление все еще скрыты в области видимости. B
; это означает, что использовать их в B
или в другом месте нам нужно использовать struct
а также enum
теги.
В следующем коде B::m_s
шкуры A::m_s
в C
, Но это можно сделать напрямую доступным через using A::m_s
,
Чтобы увидеть разницу, закомментируйте директиву using.
#include <iostream>
#include <string>
struct A {
std::string m_s;
A() :
m_s("I am A::m_s")
{}
};
struct B: A {
std::string m_s;
B() :
m_s("I am B::m_s")
{}
};
struct C: B {
using A::m_s;};
int main() {
C c;
std::cout << '\n' << c.C::m_s << '\n';
}
/*
Local Variables:
compile-command: "g++ -g test.cc -o a.exe && ./a.exe"End:
*/