vc++ 和 clang 中的 c++ typename
c++ typename in vc++ and clang
以下代码:
template<typename T>
struct A{
using TT = typename T;
};
vc++ 可以。 clang 输出:错误:之后需要一个合格的名称
'typename' 使用 TT = typename T; .
如果你改变
using TT = typename T;
至
using TT = T;
,vc++ 和 clang 都可以。
为什么?
编译器已经知道 T
是一个类型名称,因为你在 class 模板中声明了它,所以你应该 using TT = T
而不是 using TT = typename T
。
VC++ 不遵循所有 ISO 标准,因此一些在 gcc 或 clang 中编译失败的代码可能在 VC++
中工作
您的代码是不正确的 C++。 C++ 语法指定关键字 typename
(除了它用于声明模板参数的其他用途之外)只能用在 qualified-id 的开头,即至少包含一个 ::
标记的名称。
显然 MSVC 在这里允许更宽松的语法。
(typename
必须 在模板中的大多数上下文中使用,只要 qualified-id 是依赖项name 应该是类型,而不是变量或模板。这里 "dependent name" 大致意味着编译器不能确定为它找到声明,因为依赖于模板参数。但它也是有效的在不依赖或根本不在模板中的 qualified-id 上使用关键字。)
以下代码:
template<typename T>
struct A{
using TT = typename T;
};
vc++ 可以。 clang 输出:错误:之后需要一个合格的名称 'typename' 使用 TT = typename T; .
如果你改变
using TT = typename T;
至
using TT = T;
,vc++ 和 clang 都可以。
为什么?
编译器已经知道 T
是一个类型名称,因为你在 class 模板中声明了它,所以你应该 using TT = T
而不是 using TT = typename T
。
VC++ 不遵循所有 ISO 标准,因此一些在 gcc 或 clang 中编译失败的代码可能在 VC++
您的代码是不正确的 C++。 C++ 语法指定关键字 typename
(除了它用于声明模板参数的其他用途之外)只能用在 qualified-id 的开头,即至少包含一个 ::
标记的名称。
显然 MSVC 在这里允许更宽松的语法。
(typename
必须 在模板中的大多数上下文中使用,只要 qualified-id 是依赖项name 应该是类型,而不是变量或模板。这里 "dependent name" 大致意味着编译器不能确定为它找到声明,因为依赖于模板参数。但它也是有效的在不依赖或根本不在模板中的 qualified-id 上使用关键字。)