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

jms*_*jms 12 c++ string-literals constexpr c++11

我一直想知道如果有之间指出什么是任何差别ptrToArray,并ptrToLiteral在下面的例子:

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

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

And*_*zos 22

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

constexpr char a[] = "hello";

constexpr char b[] = a; // ill-formed
constexpr char b[] = "hello"; // ok
Run Code Online (Sandbox Code Playgroud)

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