在类模板特化中使用sizeof模板参数包

时间:2016-11-15 17:35:38

标签: c++ c++11 c++14 language-lawyer variadic-templates

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 扩展名以允许上述代码吗?

1 个答案:

答案 0 :(得分:4)

N4140 [temp.class.spec] /8.1:

  

不应涉及部分专用的非类型参数表达式   部分特化的模板参数除了   参数表达式是一个简单的标识符

此后core issue 1315放宽了这一点。据推测,海湾合作委员会还没有实现这一目标。