繁体   English   中英

为什么 char 数组可以是模板参数但 const char* 不能

[英]Why can an array of char be a template parameter but a const char* can't

我正在尝试将文字字符串作为 C++14 项目中的模板参数传递。 谷歌告诉我,我可以这样做:

struct Test {
    static const char teststr[];

    template<const char* str>
    void p() {std::cout << str;}
};

const char Test::teststr[] = "Hello world!";

int main() {
    Test t;
    t.p<Test::teststr>();
}

它确实奏效了。

但是,如果我使用const char* ,而不是const char [] 它行不通。

struct Test {
    static const char* teststr;

    template<const char* str>
    void p() {std::cout << str;}
};

const char* Test::teststr = "Hello world!";

int main() {
    Test t;
    t.p<Test::teststr>();
}

现在它不起作用。 编译器告诉我'Test::teststr' is not a valid template argument because 'Test::teststr' is a variable, not the address of a variable

嗯,我不知道是什么意思。

编译器的错误信息很清楚:

错误:“Test::teststr”不是有效的模板参数,因为“Test::teststr”是一个变量,而不是变量的地址

所以你需要:

#include <iostream>

struct Test {
    static const char* teststr;

    template<const char **str>
    void p() {std::cout << *str;}
};

const char* Test::teststr = "Hello world!";

int main() {
    Test t;
    t.p <&Test::teststr>();
}

然后它就起作用了——关键是变量的[内容]不是编译时常量,而变量的地址(如果它是静态变量或全局变量)是。

这只是根据c++的规则:

模板非类型参数。
对于指向对象的指针,模板参数必须指定具有静态存储持续时间和链接(内部或外部)的完整对象的地址

https://en.cppreference.com/w/cpp/language/template_parameters

全局字符数组具有链接,而字符串文字没有。
在 C++20 中,这已被更改,您可以使用字符串文字作为模板参数。

问题是,在您的示例的情况 2 中,静态数据成员teststr是一个指针类型,它具有标准不允许的字符串文字的地址,从下面引用的语句可以看出,

来自非类型模板参数的文档

非类型模板参数的模板参数应是模板参数类型的转换常量表达式(5.20)。 对于引用或指针类型的非类型模板参数,常量表达式的值不应引用(或对于指针类型,不应是地址):

  • (1.1) 子对象 (1.8),

  • (1.2) 临时对象 (12.2),

  • (1.3)字符串文字(2.13.5),

因此,如果您的示例teststr的第 2 种情况不能使用,因为它是一个指针类型,具有字符串文字"Hello world!"的地址。 .


暂无
暂无

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

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