如果依赖名称用作模板参数,是否需要用typename限定该名称?

Is it required to qualify a dependent name with typename if it is used as a template argument?

本文关键字:typename 参数 依赖 如果 是否      更新时间:2023-10-16
template<class mapT, class K, class V>
void f(mapT& m, const K& k, const V& v)
{
    pair<mapT::iterator, bool> p = m.insert(make_pair(k, v));
}

MSVC接受此代码,没有错误或警告。标准对此有什么规定?在上面的例子中,我们是允许(可选),不允许(禁止),还是要求(强制)用typename限定T::iterator ?我对c++ 03的规则特别感兴趣,尽管如果11有任何变化,那将是很高兴知道的。谢谢你。

MSVC不一致,代码段是病态的;我们必须显式地写typename T::iterator来引用T内部的类型名称iterator,因为它是依赖类型

这是编译器中一个已知的错误,请参阅相关的错误报告:

  • [bug报告] MSVC允许在依赖类型名前省略typename关键字

标准怎么说?(14882 - 2003)

14.6.2.2p1 依赖类型 [temp.dep.type]

如果是

,则类型是依赖的
  • 模板参数

  • 一个限定id带有嵌套名称说明符类名命名依赖类型,或者其不限定id命名依赖类型,

<一口>

14.6.2.4p1 依赖模板参数 [temp.dep.temp]

类型模板参数是依赖的,如果它指定的类型是依赖的。