![](/img/trans.png)
[英]Why I can't pass string literals to const char* const& in this specialized function template
[英]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.