“第一次尝试”不会编译,而第二次则不会编译。为什么?有什么不同?

首次尝试:

#include <iostream>

int main()
{
    constexpr const char text2[] = "hello";
    constexpr const char * b = &text2[4];  // error: '& text2[4]' is not a constant expression
    std::cout << b << std::endl;
}

第二次尝试:
#include <iostream>
int main()
{
constexpr const char * text1 = "hello";
constexpr const char * a = &text1[4];
std::cout << a << std::endl;

return 0;
}

我使用(g++版本4.9.2)进行编译
g++ -std=c++11 -o main *.cpp

这给出了以下错误
main.cpp: In function 'int main()':
main.cpp:7:40: error: '& text2[4]' is not a constant expression constexpr const char * b = &text2[4];  // error: '& text2[4]' is not a constant expression

最佳答案

从C++ 11标准草案5.19 [expr.const]中,我们可以看到address constant expression是(强调我的前进):



在第一种情况下,"hello"是具有静态存储持续时间的字符串文字。它被复制到没有静态存储持续时间的text2数组中。

在第二种情况下,text1是指向string literal的指针,该指针具有静态存储持续时间。

更改您的第一个示例以使text2静态(see it live):

constexpr char static text2[] = "hello";
               ^^^^^^

我们不再遇到错误。

我们可以从2.14.5 [lex.string]部分中看到字符串文字的静态存储持续时间:

10-08 09:47