为什么不能将char指针定义为数组?

时间:2018-09-02 10:53:54

标签: c++ initialization c-strings

简单的问题。我知道我应该只使用<div class="resultContainer"> <div style="display: inline;"> <div class="img-wrapper"> <img class="bookImage" src=" https://marketplace.canva.com/MAB___U-clw/1/0/thumbnail_large/canva-yellow-lemon-children-book-cover-MAB___U-clw.jpg" alt=" book.title " width="120" height="160"> </div> <div class="content-wrap"> <span class="bookTitle">Title Here</span> <br/> <span class="bookPrice">Price Here</span> </div> </div> <div class="bookTitle"></div> </div>,但很好奇为什么这样做:

std::string

这会导致第二个字符上的“初始化器值太多”吗?

const char* example = "test";

这两件事难道不完全等同吗?

2 个答案:

答案 0 :(得分:9)

区别在于字符串文字是它们自己的数组。 "test"在这里不用作数组的初始化程序(在特殊情况下,它等效于{ 't', 'e', 's', 't', '\0' }),但与其他任何值都相同。

换句话说,当您在代码中使用字符串文字"test"时,编译器会自动创建类似

的内容
static const char __str_literal0[] = {'t', 'e', 's', 't', '\0'};

然后

const char *example = "test";

就像编译一样

const char *example = __str_literal0;

即它只是指向(已经存在的静态)char数组。

另一方面,如果您尝试使用初始化列表,则编译器会将变量的第一个字段(本身就是example设置为初始化列表中的第一个值({{1}) }),然后抱怨列表中的初始化程序太多。

答案 1 :(得分:1)

  

这两件事难道不完全等同吗?

在第二个示例中,您尝试使用copy-list initialization初始化指针,这与第一个示例的等效性相差很远。

  

否则(如果T不是类类型),如果braced-init-list仅具有   一个元素,并且T不是引用类型或者是引用类型   与元素类型兼容的 T为   直接初始化(直接列表初始化)或复制初始化   (在复制列表初始化中),除了缩小转换范围是   不允许。

即使您supply only one element

const char* example = {0x74};

要停止编译器抱怨参数数量,这仍然是一个错误,因为对于有效的copy-initialization,您需要提供a pointer而不是int。

char a = 'c';
const char* example = {&a};