7

假设我有一个模板函数(例如,foo),它返回一个const依赖类型。限定返回类型的选项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++ 编译得很好。

问:

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

1 回答 1

11

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

是的。typename出现在typename-specifier 中其产生式是

typename 嵌套名称说明 符标识符
typename 嵌套名称说明符 templateopt simple-template-id

换句话说,它必须直接跟在一个nested-name-specifier之后。const不被允许。

于 2016-05-08T19:36:20.237 回答