c++ 非成员类型的using声明是否等效于标识符等于using声明符的终端名称的别名声明?

zqdjd7g9  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(77)

简而言之,我是在问

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],但我无法真正得出结论。

ghhaqwfi

ghhaqwfi1#

这两者之间肯定有区别,但是大多数程序员对其中的大多数都不感兴趣。

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
}

一个实际的区别是导出模块中先前声明的名称:
x一个一个一个一个x一个一个二个x
当然,* using-declaration * 也可以应用于非类型声明,而 * alias-declaration * 也可以作为模板。

相关问题