G CC и Visual C ++ верны.
Действительно, вы можете использовать using
, чтобы фактически изменить доступ члена, например,
using Inner_ = Inner;
с помощью
static_assert(std::is_pod<Test::Inner_>::value, "");
в функции.
Но в случае, когда псевдоним типа имеет то же имя, что и член, C ++ требует, чтобы оператор разрешения области поиска выполнял поиск члена. Таким образом, в вашем случае Test::Inner
относится к фактическому члену, а не к using
, и поэтому компиляция должна завершиться неудачей, так как это private
.
См. https://en.cppreference.com/w/cpp/language/qualified_lookup, и, в частности,
Квалифицированный поиск в области пространства имен N сначала рассматривает все объявления, расположенные в N, и все объявления, которые находятся во встроенных членах пространства имен N (и, транзитивно, в их встроенные члены пространства имен). Если в этом наборе нет объявлений, он рассматривает объявления во всех пространствах имен, названных директивами using, найденными в N, и во всех переходных элементах пространства имен N
.