我一直想知道以下示例中ptrToArray
和ptrToLiteral
指向的内容之间是否存在任何差异:
constexpr char constExprArray[] = "hello";
const char* ptrToArray = constExprArray;
const char* ptrToLiteral = "hello";
constExprArray
和两个"hello"
文字都是编译时间常数左值正确吗?答案 0 :(得分:20)
字符串文字和char的constexpr数组几乎相同。指向其中一个的指针是地址常量表达式。在常量表达式中,允许在其元素上进行左值到右值的转换。它们都具有静态存储持续时间。我所知道的唯一区别是字符串文字可以初始化数组而constexpr数组不能:
constexpr char a[] = "hello";
constexpr char b[] = a; // ill-formed
constexpr char b[] = "hello"; // ok
要解决此问题,您可以将数组包装在一个文字类型中。我们目前正在考虑标准化这样一个名为std::string_literal
或类似的包装器,但现在你必须手工完成。