字符串文字和constexpr数组之间的区别

时间:2014-03-21 04:20:14

标签: c++ c++11 constexpr string-literals

我一直想知道以下示例中ptrToArrayptrToLiteral指向的内容之间是否存在任何差异:

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

const char* ptrToLiteral = "hello";
  • 我的理解是constExprArray和两个"hello"文字都是编译时间常数左值正确吗?
  • 如果是这样,它们在可执行文件中的存储方式有什么不同,还是纯粹是编译器实现或平台特定的?
  • 他们在幕后的运行时是否有不同的待遇?
  • 还有什么需要了解的吗?

1 个答案:

答案 0 :(得分:20)

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

constexpr char a[] = "hello";

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

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