是否存在typename无法单独消歧的场景?为何标准要求template但编译器可省略?
关于typename与template消歧的疑问
我好奇是否存在仅使用typename不足以消除歧义的场景。当使用typename消歧符时,其后的qualified-id必须是一个类型。例如以下代码:
template <typename T> struct foo; template <typename T, typename U> void bar() { typename foo<T>::mystery<0> x; }
标准要求对依赖名称mystery使用template关键字,但我认为省略它不会造成解析歧义。<0不可能表示“小于0”,因为typename明确要求此处必须是类型,而表达式永远不会产生类型。
GCC可以编译这段代码,但Clang不行,并报错:
error: use 'template' keyword to treat 'mystery' as a dependent template name typename foo<T>::mystery<0> x; ^ template
我的理解是否正确:即标准要求使用template,但编译器实际不需要?
更新
C23中似乎对末尾名称mystery有一些放宽,允许在此处省略typename,但这与GCC的实现无关。GCC 10在C98模式下允许以下代码:
template <typename T> void bar() { typename foo<T>::mystery<T>::surprise<T>::shock<T> x; }
我在GCC 10的更新日志中未找到此特性。
即使是任意嵌套的情况,显然template也是不必要的,因为在解析declarator的id-expression之前,每个<都必须是模板尖括号。
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

