Является ли объявление использования для типа, не являющегося членом, эквивалентным объявлению псевдонима с идентификатором, равным терминальному имени используемого декларатора?
Короче говоря, я спрашиваю, делаю ли я
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”
Объявление -использования, конечно, также может быть применено к объявлениям, не относящимся к типу, тогда как объявление-алиаса также может быть шаблоном.