从模板函数返回的 const 相关名称,const 去哪里了?

const dependent names returned from template functions, where does const go?

假设我有一个模板函数(例如 foo),return 是一个 const 依赖类型。将 return 类型限定为 const 的选项是将 const 放在 typename 关键字的左侧:

template<typename T>
const typename T::bar
^^^^^
foo(T const& baz) {
  ...
}

或依赖类型右侧:

template<typename T>
typename T::bar const
                ^^^^^
foo(T const& baz) {
  ...
}

但是,如果我将 const 限定符放在 typename 关键字和依赖类型之间呢?

template<typename T>
typename const T::bar
         ^^^^^
foo(T const& baz) {
  ...
}

如预期的那样,无法为 GCC 和 CLANG 编译,但令我惊讶的是 VC++ 可以正常编译。

问:

Does the C++ standard says anything about where is the appropriate place to put const qualifier in such a context?

是的。 typename 出现在 typename-specifierwhose production is

typename nested-name-specifier identifier
typename nested-name-specifier templateopt simple-template-id

换句话说,它后面必须直接跟一个nested-name-specifierconst 不允许。