【发布时间】:2020-07-03 09:01:21
【问题描述】:
是否可以将数组作为非类型模板参数传递?
例如
template<typename T, T> struct s;
template<typename T, size_t S, T A[S]> struct s<T[S], A>
{ };
【问题讨论】:
标签: c++ c++17 language-lawyer
是否可以将数组作为非类型模板参数传递?
例如
template<typename T, T> struct s;
template<typename T, size_t S, T A[S]> struct s<T[S], A>
{ };
【问题讨论】:
标签: c++ c++17 language-lawyer
是的,有可能,这是一个在 C++11 及更高版本中有效的示例:
#include <cstddef>
template<typename T, size_t S, T A[S]>
struct s
{
static constexpr auto x = A[1];
};
static constexpr int a[3] = {10,20,30};
int f()
{
return s<const int, 3, a>::x;
}
f() 返回 20,如下所示:https://godbolt.org/z/GggQd9
有关参考,请参阅the draft C++17 standard §17.1.4.2 [temp.param]:
非类型模板参数应具有以下类型之一(可选 cv 限定):
- 指向对象的指针或指向函数的指针,
以及§17.1.4.8:
将类型为“T 数组”或函数类型 T 的非类型模板参数调整为“指向 T 的指针”类型
最终结果是你的T A[S]声明等同于T* A,并且允许指向对象的指针,并且数组是对象,所以代码是有效的。
【讨论】:
language-lawyer标签。