模板参数列表中的额外 typename 关键字:是否有效
Extra typename keyword in template parameter list: is it valid or not?
以下代码使用 clang 3.5.0 和 g++ 4.9.0(带 -Wall -Wextra -pedantic-errors
标志(在 C++03(标志 -std=C++03
(、C++11(标志 -std=C++11
(和 C++14(标志 -std=C++14
(下成功编译:
namespace N
{
typedef int T;
enum E{};
}
template <typename N::T>
struct ST{};
template <typename N::E>
struct SE{};
int main()
{
}
在非类型模板参数声明之前添加额外的typename
关键字是否有效?
请注意,以下代码无法编译(如 C++03、C++11 和 C++14 代码(:
typedef int T;
enum E{};
template <typename T t>
struct ST{};
template <typename E e>
struct SE{};
int main()
{
}
但是下面的编译再次很好(C++03、C++11 和 C++14(:
typedef int T;
enum E{};
template <typename ::T>
struct ST{};
template <typename ::E>
struct SE{};
int main()
{
}
这是允许的,但仅限于限定名称:
类型名称说明符:
typename
嵌套名称说明符标识符
typename
嵌套名称说明符template
选择简单模板 ID
所以根据语法typename E
是错误的。 typename N::E
不是,因为名称是限定的。第三种情况,typename ::E
,很好,因为::
是一个有效的嵌套名称说明符。
C++03 标准在 [temp.res]/5 中规定
关键字
typename
应仅适用于限定名称,但 这些名称不必是依赖的。
C++11 标准没有明确说明这一点,但在 [temp.names]/5 中的注释中:
[ 注意:与
typename
前缀一样,template
在非绝对必要的情况下,允许使用前缀;即, 当嵌套名称说明符或左侧的表达式->
或.
不依赖于模板参数或使用 不显示在模板的范围内。— 尾注 ]
同样的音符存在于 C++14 标准中完全相同的位置。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- SFINAE的Typename关键字
- 有什么技巧可以避免在模板类中使用"typename"关键字吗
- 为什么在VS2015中模板相关的嵌套类型名称中不需要typename关键字?
- 标准::函数的 typename 关键字
- 为什么我应该使用"typename"关键字来定义?
- 为什么C++编译器在这种特殊情况下需要 "typename" 关键字?
- 模板参数列表中的额外 typename 关键字:是否有效
- 为什么在函数参数列表中重复typename关键字是必要的
- typename关键字是如何工作的
- 为什么关键字"typename"在限定的从属名称之前需要,而不是在限定的独立名称之前?
- 为什么C++17在模板中有两个关键字(class和typename)用于相同的目的
- 什么时候需要"typename"关键字?
- 即使typename关键字也会抛出Typedef错误
- 再次强调typename和template关键字
- 多个嵌套的依赖名称 - 将 typename 关键字粘贴在哪里