从模板函数返回的const依赖名称,const在哪里?

101*_*010 7 c++ templates dependent-name language-lawyer c++11

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

template<typename T>
const typename T::bar
^^^^^
foo(T const& baz) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

或在依赖类型的右侧:

template<typename T>
typename T::bar const
                ^^^^^
foo(T const& baz) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

template<typename T>
typename const T::bar
         ^^^^^
foo(T const& baz) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

如上所述,无法为GCC和CLANG编译,但令我惊讶的是VC++编译得很好.

问:

  • 这是VC++扩展吗?
  • C++标准是否说明了const在这样的上下文中放置限定符的适当位置?

T.C*_*.C. 11

C++标准是否说明了const在这样的上下文中放置限定符的适当位置?

是.typename出现在typename-specifier中,其生成是

typename nested-name-specifier 标识符
typename nested-name-specifier templateopt simple-template-id

换句话说,它必须直接遵循嵌套名称说明符.const不被允许.