这个`const char*`的断言是否保证是真的?

big*_*iao 2 c++ arrays comparison pointers string-literals

这是代码示例(在vs2015中编译并运行):

#include<cassert>
using namespace std;
int main() {

    const char*p = "ohoh";
    const char*p1 = "ohoh";
    char p3[] = "ohoh";
    char p4[] = "ohoh";
    assert(p == p1);//OK,success,is this always true?
    assert(p3 == p4);//failed

    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

据我所知,字符串文字存储在readonly地址空间的段中, const char*p = "ohoh";只是生成一个指向该位置的指针.但是,似乎编译器只生成该字符串文字的一个副本,所以这p==p1是真的.

它是一种优化,还是标准保证的东西?

Lin*_*gxi 7

不,标准不保证.根据cppref:

允许编译器(但不是必需的)将存储组合为相等或重叠的字符串文字.这意味着当通过指针进行比较时,相同的字符串文字可能会或可能不会比较相等.


son*_*yao 7

行为未指定,您不能依赖它.从标准来看,[lex.string]/16

是否所有字符串文字都是不同的(即,存储在非重叠对象中)以及是否对字符串文字的连续评估产生相同或不同的对象是未指定的.

对于p3p4,他们是不同的东西.请注意,pp1有指针(字符串字面),但p3p4来自数组初始化字符串文字.

字符串文字可用于初始化字符数组.如果数组初始化为char str[] = "foo";,str则将包含该字符串的副本"foo".

这意味着p3并且p4是独立的数组.当衰减到指针时它们将是不同的(因为它们指向不同的数组),那么p3 == p4就是false.