使用现有命名空间类型的声明与创建类型别名

Using-declaration of an existing namespace type vs creating a type alias

这不是关于 usingtypedef 之间创建类型别名的区别的问题。我想提供从代码块或函数内的命名空间访问现有类型的权限。

我发现了两种不同的方法:

我可以 "include" 使用 using 声明的类型 :

using typename mynamespace::mytype;

或者我可以创建类型别名:

typedef mynamespace::mytype mytype;
using mytype = mynamespace::mytype; //C++11
  1. 有什么不同吗?
  2. 每种语法的优缺点是什么?
  3. 哪个最多used/recommended?

谢谢。

相关问题:Using-declaration of an existing type from base class vs creating a type alias inside child class

Is there any difference ?

命名空间中名称的类型别名可以出现在class

struct S { using mytype = mynamespace::mytype; };

而 using 声明可能不会。

What are the pros and cons of each syntax ?

如果您正在处理 class 范围,那么前一点是一个相当大的骗局。

除此之外,这两种方法非常相似。别名是一个新名称,它完全代表被别名的类型。而 using 声明将类型的现有名称带入范围。如果您对两者都使用 mytype,您将不会注意到差异。

Which one is the most used/recommended ?

我怀疑是否就此达成共识。必要时使用必须使用的那个(class 范围),但在其他情况下请遵守团队的风格指南。

我发现这两种语法之间的另一个区别:无法在同一范围内定义与现有名称空间同名的类型别名。

namespace name1 {
    struct name2 {};
}

namespace name2 {
    struct name3 {};
}

//error: 'typedef struct name1::name2 name2' redeclared as different kind of symbol
/* typedef name1::name2 name2; */

//OK
using typename name1::name2;

//error: 'name2' does not name a type
/* name2 val1 = {}; */

//OK disambiguation with keyword "struct"
struct name2 val2 = {};

//OK namespace qualifier with "::"
name2::name3 val3 = {};

int main(){
    //OK different scope
    typedef name1::name2 name2;
    name2 val = {};
}