字符串字面值和constexpr字符数组的区别

21

我一直在想,下面例子中 ptrToArrayptrToLiteral 指向的内容是否有任何区别:

constexpr char constExprArray[] = "hello";
const char* ptrToArray = constExprArray;

const char* ptrToLiteral = "hello";
  • 我理解constExprArray和两个"hello"字面常量都是编译时常量lvalue,这正确吗?
  • 如果是,它们在可执行文件中的存储方式是否有区别,还是纯粹由编译器实现或平台决定?
  • 它们在幕后的运行时处理方式是否不同?
  • 还需要了解其他信息吗?
1个回答

31

字符串字面值和constexpr字符数组几乎相同。它们的指针都是地址常量表达式。在常量表达式中,它们的元素都允许进行左值到右值的转换。它们都具有静态存储期。我知道的唯一区别是字符串字面值可以初始化数组,而constexpr数组不能:

constexpr char a[] = "hello";

constexpr char b[] = a; // ill-formed
constexpr char b[] = "hello"; // ok

为了解决这个问题,你可以将数组包装在一个字面类型的类中。我们目前正在考虑标准化这样的包装器,将被称为std::string_literal或类似名称,但现在你必须手动完成此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接