Является ли объявление использования для типа, не являющегося членом, эквивалентным объявлению псевдонима с идентификатором, равным терминальному имени используемого декларатора?

Короче говоря, я спрашиваю, делаю ли я

      using foo::bar::baz;

имеет тот же эффект, что и

      using baz = foo::bar::baz;

(Очевидно, я предполагаю, чтоfoo::bar::bazназывает тип, который не является членом класса, например, я имею в виду что-то вродеnamesapce foo::bar { using baz = int; }, а не что-то вродеnamespace foo { struct bar { using baz = int; }; }.)

Я почти уверен, что это две разные вещи (иначе они тоже всегда могли бы оставаться рядом, что не так, так как я знаю, что первое не может быть в одном месте).struct/class, в отличие от последнего), но как мне его прочитать из стандарта? Я просматривал [namespace.udecl] и [dcl.pre] , но не могу сделать вывод.

1 ответ

Между ними определенно есть различия, но большинство из них не представляют интереса для большинства программистов. Например,

      namespace N {
  struct X {};
  struct Y {};
  struct Z {};
}
namespace O {
  int X,Y;
  using N::X;    // OK
  struct X x;    // OK, finds N::X
  int i=X;       // OK, finds O::X
  using Y=N::Y;  // error: conflicts with “int Y”
  using Z=N::Z;
  struct Z z;    // error: elaborated-type-specifier with typedef-name
}

Одно практическое отличие заключается в экспорте ранее объявленного имени в модуле:

      export module A;
export struct S {};
export struct T {};
      export module B;
import A;
export using ::S;  // OK
export using T=T;  // error: conflicts with “struct T”

Объявление -использования, конечно, также может быть применено к объявлениям, не относящимся к типу, тогда как объявление-алиаса также может быть шаблоном.

Другие вопросы по тегам