vso*_*tco 41 c++ language-lawyer c++11
我非常清楚为什么需要使用typename依赖类型,因为当它看到类似的东西时,编译器可能无法消除类型和变量声明之间的歧义T::type,请参阅此答案以获得一个很好的解释.TL; DR:在类似的表达式中T::type * x;,编译器不能"知道" T::type是某个类型,还是在某个特定的特化中声明的变量T.
但是,在类似的东西
using type = T::type;
Run Code Online (Sandbox Code Playgroud)
没有任何暧昧.IMO T::type 应该始终被解析为一个类型,因为它是using语句的RHS的一部分.但是,我们仍然需要在typename这里使用(至少根据gcc和clang),
using type = typename T::type;
Run Code Online (Sandbox Code Playgroud)
Live on Coliru, gcc Live on Coliru, clang
Visual C++ 似乎接受了没有a 的代码typename,但是我对编译器完全符合标准没有太多信心(实际上,它有许多非标准扩展,例如将rvalues绑定到非const引用).
问:有什么理由说这不是typenameC++ 11及更高版本规则的例外吗?
模板参数类型 T 没有,也不能隐式地携带其内部组件。因此,当编译器查看未实例化的模板时,T::type 基本上是一个新类型,因此需要声明一个新的类型名“T::type”。
不幸的是,我认为这个问题将一直困扰我们,直到该标准包含成熟的概念。
| 归档时间: |
|
| 查看次数: |
846 次 |
| 最近记录: |