繁体   English   中英

数组作为非类型模板参数

[英]Array as non-type template argument

我注意到了

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编译

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM