gpt4 book ai didi

c++ - 为什么 VS2015 中模板相关的嵌套类型名称不需要 typename 关键字?

转载 作者:太空狗 更新时间:2023-10-29 19:55:56 24 4
gpt4 key购买 nike

我正在阅读有关 typename 在 C++ 模板编程中的用法(例如 this Q/A )。在我看来,似乎在使用依赖嵌套类型名称 时,我们应该使用typename 来避免解析歧义。我还在 Scot Meyers 的书 effective 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;
}

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

更新 1:感谢@FrançoisAndrieux 的评论,VS2008 和 VS2010 中似乎发生了同样的事情,如 this Q/A 中所报告的那样.

最佳答案

typename 在那里不需要。在某些情况下,不再需要 typename,因为从句法上讲,那里的任何内容都必须是一个类型。

特别是:

A qualified name that appears in type-id, where the smallest enclosing type-id is:

  • the type in a new expression that does not parenthesize its type;

Quoted source不是直接来自标准,但非常可靠。

之前那里需要 typename;它将被解析为一个值,并且 new value 不是有效语法。在 typename 在该上下文中是可选的

现在,没有其中的特点;您所看到的是 MSVC 未能正确实现 // , 不是 扩展名。

关于c++ - 为什么 VS2015 中模板相关的嵌套类型名称不需要 typename 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58101319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com