为什么 constexpr 没有唯一的价值或存储?
Why doesn't a constexpr have a unique value or storage?
我正在使用Wt::WFormModel,其示例将字段名称表示为static const char*
。 我一次对我的项目进行了大量更改,其中之一是将字段表示更改为constexpr
。 经过大量故障排除,我在 WFormModel 文档中找到了以下语句:
字段类型为
const char *
,而不是字符串比较 标识字段,使用指针比较。因此,您真的应该 在整个代码中使用相同的字段常量来引用给定的 字段,并且您不能对字段常量使用 C++11constexpr
,因为 没有唯一值(因为它没有存储)。
constexpr char*
的表示与const char*
的表示相比如何?
出于同样的原因,这不一定有效:
const char *lit1 = "foo";
const char *lit2 = "foo";
assert(lit1 == lit2);
编译器可以识别这两个文本实际上是相同的值,并在此过程中为它们提供相同的存储。但未必。而且标准并不要求它这样做。
如果lit1
和lit2
位于不同的文件中,则为它们提供相同的指针值将从编译器技巧变为链接器技巧。这种情况发生的可能性要小得多。
将constexpr
视为创建文字的复杂方法的一种方式。因此,constexpr
变量就像文字;它的存储(如果有的话)不受任何一个翻译单元或使用点的约束。编译器/链接器可以将它们整理在一起...或者它不能。该标准不要求他们这样做。
相关文章:
- 将字符串存储在c++中的稳定内存中
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- Visual C++ constexpr Hints
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 为什么constexpr的性能比正常表达式差
- 存储模板类型以强制转换回派生<T>
- 将字符串存储在 constexpr 结构中
- 将 OpenGL 颜色附件存储在 constexpr GLenum 数组中
- 将对静态存储 cstyle 数组的引用从 constexpr 函数传递到另一个 constexpr 函数
- C++ constexpr 到位对齐的存储结构
- 为什么 constexpr 没有唯一的价值或存储?
- 静态constexpr成员存储