我很好奇是否有这样的情况
typename
就其本身而言并不能充分消除歧义。
当
类别名
如果使用消歧器,则执行以下操作
合格id
必须是类型。
例如,在以下代码中:
template <typename T>
struct foo;
template <typename T, typename U>
void bar() {
typename foo<T>::mystery<0> x;
}
该标准要求使用
template
对于从属名称
mystery
,但如果您省略它,我不会意识到解析的歧义
<0
不可能是“小于零”的意思,因为
类别名
说我们必须产生一个类型,而表达式永远不会产生类型。
GCC compiles this, but clang doesn't
并产生错误:
error: use 'template' keyword to treat 'mystery' as a dependent template name
typename foo<T>::mystery<0> x;
^
template
我的理解正确吗。
样板
是标准要求的,但对编译器来说不是必需的?
使现代化
在C++23中似乎只对终端名称有一些放宽
神秘的事物
,这可能允许省略
类别名
但这些都与海湾合作委员会的实施无关。C++98模式下的GCC 10允许:
template <typename T>
void bar() {
typename foo<T>::mystery<T>::surprise<T>::shock<T> x;
}
在中找不到此功能
changelogs
。
即使使用任意嵌套
样板
在这里是不必要的,因为在我们解析
id表达式
的
声明人
每一个
<
必须是一个模板尖括号。