我很清楚为什么需要使用typename
对于依赖类型,因为编译器在看到类似的内容时可能无法消除类型和变量声明之间的歧义T::type
,参见例如这个答案 https://stackoverflow.com/a/613132/3093378一个很好的解释。TL;DR: 在这样的表达中T::type * x;
,编译器无法“知道”是否T::type
是在某些特定专业化中声明的类型或变量T
.
然而,在类似的事情中
using type = T::type;
没有什么含糊之处。国际海事组织,T::type
应该始终被解析为类型,因为它是 RHS 的一部分using
陈述。然而,我们仍然需要使用typename
在这里(至少根据 gcc 和 clang ),
using type = typename T::type;
Live on Coliru, gcc http://coliru.stacked-crooked.com/a/99d7b4b951ce4af7
Live on Coliru, clang http://coliru.stacked-crooked.com/a/775c23fb9576fd0b
视觉C++似乎接受代码 http://rextester.com/HYWJH30088没有typename
,但是我对编译器完全符合标准并没有太多信心(事实上,它有许多非标准扩展,例如将右值绑定到非常量引用)。
Question: 有什么理由说这不是例外吗?typename
C++11 及更高版本中的规则?
没有什么硬道理。作为拉里斯马克 说 https://stackoverflow.com/questions/41841516/why-does-one-still-need-to-disambiguate-a-dependent-type-with-typename-in-the-rh#comment74038267_41841516,今年讨论了一篇论文(针对 C++20,而不是 17!)。有担忧,但也有反对意见:
- 它可以被视为使语言变得不那么规则(如代码截图说 https://stackoverflow.com/questions/41841516/why-does-one-still-need-to-disambiguate-a-dependent-type-with-typename-in-the-rh#comment78895926_44528344),但新的想法是消除歧义
typename
将变得足够罕见,以至于在另一个方向上具有近乎一致性。 (作为有人说过 https://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords/613132#613132,已经存在基类名称形式的例外情况。)
- 它可能会排除可能的延期(如T.C.报道 https://stackoverflow.com/questions/41841516/why-does-one-still-need-to-disambiguate-a-dependent-type-with-typename-in-the-rh#comment70872165_41841516),但扩展可以有自己的歧义消除,而不是增加常见情况的负担。
该文件得到了强有力的支持,新规则可能会在几个月后出现在工作草案中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)