数组作为非类型模板参数

Array as non-type template argument

本文关键字:参数 类型 数组      更新时间:2023-10-16

我注意到

template <size_t n, char[n]> class x
{
};

被我的C++编译器愉快地接受了。但是,当我天真地尝试类似

x <4, "hey"> something;

我得到一个很好的

Non type template argument does not refer to any declaration

所以我想知道:我将如何用该模板实际制作一个类?

#include <iostream>
template <size_t n, char s[n]>
class X {
public:
  X() {
    std::cout << s;
    std::cout << std::endl;
  }
};
char hey[] = "hey";
int main() {
  X<4, hey> x;
}

但是X<4, "hey"> x;不会编译,因为对于非类型模板参数,存在某些限制:

对于指向对象的指针,模板参数必须指定 具有静态存储持续时间和链接的对象地址 (内部或外部),或计算 到相应的空指针或 std::nullptr_t 值。

这引发了另一个问题,我在 cppreference.com 上发现了以下内容:

数组和函数类型可以写在模板声明中,但 它们会自动替换为指向对象的指针和指向的指针 功能适当。

所以s实际上是一个指针,因此将编译以下内容:

X<5, hey> something;

潜在的缓冲区溢出问题。

template <size_t n, char[n]> class x
{
};
char foobar[]="hey";
x<4, foobar> y;

使用 gcc 5.3.1 编译