c++ constexpr const char * vs constexpr const char []

栏目: C++ · 发布时间: 7年前

内容简介:代码日志版权声明:翻译自:http://stackoverflow.com/questions/33692872/constexpr-const-char-vs-constexpr-const-char

第一次尝试不会编译,而第二次尝试.为什么?有什么不同?

第一次尝试:

#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
从C11标准5.19 [expr.const]草案可以看出, address constant expression

是(重点是煤锣前进):

[…] a prvalue core constant expression

of

pointer type that evaluates to the address of an object with

, to the address of a function, or to a null

pointer value, or a prvalue core constant expression of type

std::nullptr_t.

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

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

改变你的第一个例子,使text2 static( see it live ):

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

我们不再收到错误.

我们可以看到一个字符串文字具有从2.14.5节[lex.string]的静态存储时间:

Ordinary string literals and UTF-8 string literals are also referred  to as narrow string literals. A narrow string literal has type “array  of n const char”, where n is the size of the string as defined below,  and has static storage duration (3.7).

代码日志版权声明:

翻译自:http://stackoverflow.com/questions/33692872/constexpr-const-char-vs-constexpr-const-char


以上所述就是小编给大家介绍的《c++ constexpr const char * vs constexpr const char []》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++编程思想(第1卷)

C++编程思想(第1卷)

[美] Bruce Eckel / 刘宗田、袁兆山、潘秋菱 / 机械工业出版社 / 2002-9 / 59.00元

《C++编程思考》第2版与第1版相比,在章节安排上有以下改变。增加了两章:“对象的创建与使用”和“C++中的C”,前者与“对象导言”实际上是第1版“对象的演化”一章的彻底重写,增加了近几年面向对象方法和编程方法的最瓣研究与实践的有效成果,后者的添加使不熟悉C的读者可以直接使用这本书。删去了四章:“输入输出流介绍”、“多重继承”、“异常处理”和“运行时类型识别”,删去的内容属于C++中较复杂的主题,......一起来看看 《C++编程思想(第1卷)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具