为什么constexpr没有独特的价值或存储?

时间:2016-02-28 02:07:17

标签: c++ c++11

我正在使用Wt :: WFormModel,其示例将字段名称表示为static const char*。我一次对我的项目进行了一些更改,其中一个更改字段表示为constexpr。经过多次故障排除后,我在the WFormModel documentation

中找到了此声明
  

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

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

1 个答案:

答案 0 :(得分:2)

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

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

编译器可以识别这两个文字实际上是相同的值,这样做可以为它们提供相同的存储空间。但它可能不会。标准并不要求它。

如果lit1lit2在不同的文件中,那么给它们相同的指针值就是从编译器技巧到链接器技巧。这种情况发生的可能性要小得多。

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