【问题标题】:Using-declaration of an existing namespace type vs creating a type alias现有命名空间类型的使用声明与创建类型别名
【发布时间】:2020-02-15 06:52:50
【问题描述】:

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

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

我可以使用 using 声明“包含”该类型:

using typename mynamespace::mytype;

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

typedef mynamespace::mytype mytype;
using mytype = mynamespace::mytype; //C++11
  1. 有什么区别吗?
  2. 每种语法的优缺点是什么?
  3. 哪个是最常用/推荐的?

谢谢。

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

【问题讨论】:

    标签: c++ typedef type-alias using-declaration


    【解决方案1】:

    我发现了两种语法之间的另一个区别:在同一范围内,不能定义与现有命名空间同名的类型别名。

    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 = {};
    }
    

    【讨论】:

      【解决方案2】:

      有什么不同吗?

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

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

      而 using 声明可能不会。

      每种语法的优缺点是什么?

      如果您正在处理类范围,前一点是一个很大的问题。

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

      哪个是最常用/推荐的?

      我怀疑对此是否达成共识。必要时使用必须的(类范围),否则请遵守团队的风格指南。

      【讨论】:

      • struct test : base { using typename base::mytype; };也可以使用。
      • @Baptistou - 你的问题是关于命名空间的,我按照这个回答。
      • @Baptistou - 不要。编辑和使现有答案无效是对 SO 的不良礼节。你总是可以问别人
      • 好的,我会这样做并链接到这篇文章。
      • @Baptistou - 好电话!这就是创建有用的问题库的方式:)
      猜你喜欢
      • 2020-02-15
      • 2015-11-21
      • 2013-03-05
      • 1970-01-01
      • 2016-02-10
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      相关资源
      最近更新 更多