首页 > 解决方案 > 为什么在模板声明中使用类型说明符时可以被视为限定 ID

问题描述

template<typename T>
void fun(){
  T::type v;  
}

在此示例中,T::type被视为表达式。相关规则在目前的草案中有说明,即:
temp.res#general-5

其终端名称是依赖的且位于仅类型上下文中的限定 ID被视为表示类型。

在我看来,T::type v无论如何T::type都不应该将其视为一种表达方式。因为根据整个部分expr,如果遵守 [expr] 中列出的语法,那不可能是表达式。

在这种情况下,T::type应将其视为具有 形式的简单类型说明符nested-name-specifier opt type-name。至少,它是一个类型说明符而不是一个qualified-id. 所以,我想知道 [temp.res#general-5] 如何适用于这个例子,该规则的前提条件是组件应该首先是一个qualified-id

作为对比,下面的例子有点不同

template<typename T>
void fun(){
   T::type * v;
}

对于T::type* v,根据 [expr] 的语法,T::type可以认为是一个qualified-id。根据 [声明],它也可以被视为类型说明符。标准中没有详细说明如何解决模板声明中出现的语句的歧义(是否将限定名称视为限定 ID 或某些看起来像限定 ID 的组件,例如简单类型-说明符)。

如前所述,规则 [temp.res#general-5] 不涵盖这些用于形成语句的组件,如果它遵守相应的有效语法,则不能被视为限定 ID。那么,如何解读这些问题呢?

标签: c++templateslanguage-lawyer

解决方案


推荐阅读