gpt4 book ai didi

C++ 非类型模板参数 const char*

转载 作者:太空狗 更新时间:2023-10-29 23:10:39 27 4
gpt4 key购买 nike

假设我们有

template <const char*>
struct A{};

// static storage
const char a[] = "asd";
const char* p = "asd";

这个实例化

A<a>{};

编译器没问题。这是可以理解的——数组 a 衰减为指向第一个元素的指针。但是如果我们像这样用 p 实例化 A

A<p>{};

编译器报错:

error: non-type template argument of type 'char *' is not a constant expression

为什么标准不允许指定 const char* 类型的命名变量或只是字符串文字 "asd",顺便说一句,它本身是左值,作为模板参数?

最佳答案

数组 a 是一个常量字符数组,它在编译时被完全初始化并且编译器也得到一个已知的内存地址,这就是为什么它可以衰减到模板中的指针.

但是p是一个指向字符常量数组的指针,但是指针本身不是编译时常量,可以改成指向其他字符串,并且它不是在编译时初始化,而是在链接时(发生在编译后)或程序加载到内存时初始化。 p 的地址在编译时是已知的,但不是 p 指向的字符串文字的地址。


进一步解释字符串文字的地址在编译时未知的原因,这是因为它被编译器代码生成器放在一个特殊的只读段中,然后该只读段与来自其他 translation units 的只读段链接时。这就是为什么直到链接时(最早)才能知道字符串文字的最终地址。

关于C++ 非类型模板参数 const char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56143022/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com