const值作为模板参数

时间:2017-04-27 13:34:48

标签: c++ templates metaprogramming template-meta-programming

我刚从gcc和clang遇到编译错误,所以我认为这段代码是不可能的:

template < typename T >
struct Type {

  using type = T;
};

template < int size = 1024 >
struct Foo {};

constexpr auto test_ = [] (const int size) {

  return Type<Foo<size>>;
};

编译错误:

test.cpp:12:19: error: non-type template argument is not a constant expression
  return Type<Foo<size>>;
                  ^
1 error generated.

问题是为什么? size是一个const值,应该能够作为模板参数吗?我已经使用了一些静态const值作为模板参数,但似乎不支持这种情况。

1 个答案:

答案 0 :(得分:4)

  

size是一个const值,应该能够作为模板参数吗?

不,const值不一定在编译时知道(即它们不是常量表达式

你想要的是std::integral_constant

constexpr auto test_ = [] (auto size) 
{
    return Type<Foo<size>>{};
};

test_(std::integral_constant<int, 100>{});

作为评论中提到的Rakete1111,行return Type<Foo<size>>;也是格式错误的 - 您可能想要像我上面那样实例化它。