为什么 constexpr 没有唯一的价值或存储?

Why doesn't a constexpr have a unique value or storage?

本文关键字:存储 constexpr 唯一 为什么      更新时间:2023-10-16

我正在使用Wt::WFormModel,其示例将字段名称表示为static const char*。 我一次对我的项目进行了大量更改,其中之一是将字段表示更改为constexpr。 经过大量故障排除,我在 WFormModel 文档中找到了以下语句:

字段类型为 const char * ,而不是字符串比较 标识字段,使用指针比较。因此,您真的应该 在整个代码中使用相同的字段常量来引用给定的 字段,并且您不能对字段常量使用 C++11 constexpr,因为 没有唯一值(因为它没有存储)。

constexpr char*的表示与const char*的表示相比如何?

出于同样的原因,这不一定有效:

const char *lit1 = "foo";
const char *lit2 = "foo";
assert(lit1 == lit2);

编译器可以识别这两个文本实际上是相同的值,并在此过程中为它们提供相同的存储。但未必。而且标准并不要求它这样做。

如果lit1lit2位于不同的文件中,则为它们提供相同的指针值将从编译器技巧变为链接器技巧。这种情况发生的可能性要小得多。

constexpr视为创建文字的复杂方法的一种方式。因此,constexpr变量就像文字;它的存储(如果有的话)不受任何一个翻译单元或使用点的约束。编译器/链接器可以将它们整理在一起...或者它不能。该标准不要求他们这样做。