Класс или перечисление с использованием объявления

В начале 3.4.3.1/1 N3797 сказано:

Если спецификатор вложенного имени квалифицированного идентификатора назначает класс,
имя, указанное после поиска спецификатора вложенного имени в
область применения класса (10.2), за исключением случаев, перечисленных ниже.

и одно из этих правил:

поиск имени, указанного в объявлении использования (7.3.3) также
находит имена классов или перечислений, скрытые в одной и той же области видимости
(3.3.10).

Можете привести пример, демонстрирующий это правило?

3

Решение

Я считаю, что это то, что стандарт предусматривает:

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 теги.

0

Другие решения

В следующем коде 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:
*/
0

По вопросам рекламы [email protected]