使用using定义引用类型的引用别名:MSVC编译通过GCC拒绝是否合规?
C++引用类型别名的编译差异:MSVC vs GCC/Clang
你的代码里,using type = int(int)&;是将type定义为返回int、参数为int的函数类型的引用,而后续using type2 = type&;试图给这个引用类型再声明一层引用别名——这不符合C++标准,是MSVC的非标准扩展导致它能编译通过。
核心原因
- C++标准明确禁止:标准规定不存在"引用的引用"这种类型,因为引用本身是对对象的绑定,重复引用没有合法语义,属于"不合格的引用类型",GCC和Clang的报错
cannot declare reference to qualified reference type完全符合标准要求。 - MSVC的非标准行为:MSVC在这里做了非标准的类型折叠处理,自动将"引用的引用"折叠为普通引用,所以允许编译,但这是编译器的扩展特性,而非标准规定的合法语法。
修正写法
如果你的需求是声明函数类型的引用别名,直接复用原类型即可,不需要额外加引用:
using type = int(int)&; using type2 = type; // 等价于int(int)&,符合标准,所有编译器均可通过
或者直接显式声明:
using type2 = int(int)&;
内容的提问来源于stack exchange,提问作者user21834971
相关产品推荐
相关产品推荐

