从模板函数返回的 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++ 可以正常编译。
问:
- 这是 VC++ 扩展吗?
- C++ 标准是否说明了在这样的上下文中放置
const
限定符的适当位置?
Does the C++ standard says anything about where is the appropriate
place to put const
qualifier in such a context?
是的。 typename
出现在 typename-specifier、whose production is
中
typename
nested-name-specifier identifier
typename
nested-name-specifier template
opt simple-template-id
换句话说,它后面必须直接跟一个nested-name-specifier。 const
不允许。
假设我有一个模板函数(例如 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++ 可以正常编译。
问:
- 这是 VC++ 扩展吗?
- C++ 标准是否说明了在这样的上下文中放置
const
限定符的适当位置?
Does the C++ standard says anything about where is the appropriate place to put
const
qualifier in such a context?
是的。 typename
出现在 typename-specifier、whose production is
typename
nested-name-specifier identifier
typename
nested-name-specifiertemplate
opt simple-template-id
换句话说,它后面必须直接跟一个nested-name-specifier。 const
不允许。