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

时间:2016-05-08 19:30:15

标签: c++ templates c++11 language-lawyer dependent-name

假设我有一个模板函数(例如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限定符放在这样的上下文中的适当位置?

1 个答案:

答案 0 :(得分:11)

  

C ++标准是否说明了适当的地方   在这样的背景下放置for...of限定符的位置?

是。 const出现在 typename-specifier whose production is

  

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

换句话说,必须直接使用嵌套名称说明符。 <{1}}是不允许的。

相关问题