§14/ 2中“最后一个组成部分”一词的含义是什么?

时间:2015-01-28 22:33:26

标签: c++ templates c++11 language-lawyer c++14

§14/ 2(强调我的)

  

template-declaration 只能作为命名空间范围或类出现   范围声明。在函数模板声明中,最后一个    declarator-id 的组件不应是 template-id 。 [ 注意:   最后一个组件可能是标识符 operator-function-id ,    conversion-function-id literal-operator-id 。在课堂上   模板声明,如果类名是 simple-template-id ,则   声明声明了一个类模板部分特化(14.5.5)。    - 后注]

请注意, declarator-id 在语法(N4140)中定义,如下所示:

声明符-ID
... opt id-expression

ID-表达
不合格-ID
qualified-id

不合格-ID
标识符
操作员功能-ID
转换函数-ID
字面运营商-ID
类名
decltype-specifier
template-id

鉴于此,在函数模板声明中, declarator-id 是标识符, operator-function-id conversion-function-id literal-operator-id ,上面的表达“最后一个组件”是什么意思?

1 个答案:

答案 0 :(得分:2)

在语法引用中,您省略了 qualified-id 的制作,该制作扩展为 unqualified-id 的序列,最后一个组件指的是最后一个 unqualified-id

标准告诉你 函数模板声明不能以 template-id 结尾 与类模板的部分特化相反

template<typename T> class A {};
template<typename T> class A<std::vector<T> > {}; // ends with simple-template-id

即使功能模板的 qualified-id 的某些组件可能是 template-id ,例如

template<typename>
struct A {
    void f();
};
template<typename T>
void A<T>::f() {} // cannot end with template-id