在 GCC 上编译以下代码(从右到左从1开始的索引从类型列表中选择类型的元函数)检查时的校正失败,而 clang 接受此代码:
#include <cstdlib>
template< std::size_t i, typename ...types >
struct at_index
{
};
template< typename first, typename ...rest >
struct at_index< (1 + sizeof...(rest)), first, rest... >
{
using type = first;
};
template< std::size_t i, typename first, typename ...rest >
struct at_index< i, first, rest... >
: at_index< i, rest... >
{
};
int main()
{
}
哪种编译器是对的?
GCC错误消息:
error: template argument '(1 + sizeof... (rest))' involves template parameter(s)
struct at_index< (1 + sizeof...(rest)), first, rest... >
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我认为sizeof...
运算符中参数包的类型不应解析为符号名称的某些部分。因此,这里不应该存在名称错位问题。
这是 clang 扩展名以允许上述代码吗?
答案 0 :(得分:4)
N4140 [temp.class.spec] /8.1:
不应涉及部分专用的非类型参数表达式 部分特化的模板参数除了 参数表达式是一个简单的标识符。
此后core issue 1315放宽了这一点。据推测,海湾合作委员会还没有实现这一目标。