为什么在VS2015中依赖模板的嵌套类型名称中不需要typename关键字?

Gup*_*pta 3 c++ templates typename c++11 visual-studio-2015

我正在阅读有关typenameC ++模板编程中用法的信息(例如,此Q / A)。对我来说,似乎在使用依赖的嵌套类型名称时,应该使用typename以避免解析歧义。我还在Scot Meyers的有效C ++书籍#42中对此进行了检查。

但令我感到奇怪的是,书中的相同示例在没有的情况下可以正常工作typename。这是代码:

template<class C>
void Print2nd(const C & cont)
{
   if (cont.size() >= 2)
   {
      C::const_iterator * iter1 = new C::const_iterator(cont.begin());  // why typename is NOT needed?
      C::const_iterator   iter2 = cont.begin();                         // why typename is NOT needed?
      (*iter1)++;
      iter2++;
      int value1 = **iter1;
      int value2 = *iter2;

      std::cout << "The value of 2nd with pointer is: " << value1 << std::endl;
      std::cout << "The value of 2nd without pointer is: " << value2 << std::endl;
   }
}


int main()
{
   std::vector<int> vect = {1,2,3,4,5,6};
   Print2nd(vect);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用VS2015。那么,问题是为什么typename在这种情况下不需要?最近的C ++编译器是否有任何升级以避免typename在这种情况下使用?还是我在代码中做错了?

更新1:感谢@FrançoisAndrieux的评论,似乎在此Q / A中报告了VS2008和VS2010中正在发生同样的事情。

Yak*_*ont 5

typename中不需要那里。在某些情况下,不再需要typename,因为从语法上讲任何东西都必须有一个类型。

特别是:

出现在type-id中的限定名称,其中最小的type-id为:

  • 新表达式中的类型,该类型不带括号;

引用的来源不是直接来自标准,而是相当可靠的。

在那之前需要 typename;它会被解析为值,并且new value语法无效。在这种情况下,在 typename可选的

现在,中没有功能;您所看到的是,MSVC无法正确实现 / / ,而不是扩展。