简单的问题。我知道我应该只使用<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";
这两件事难道不完全等同吗?
答案 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为 直接初始化(直接列表初始化)或复制初始化 (在复制列表初始化中),除了缩小转换范围是 不允许。
const char* example = {0x74};
要停止编译器抱怨参数数量,这仍然是一个错误,因为对于有效的copy-initialization
,您需要提供a pointer而不是int。
char a = 'c';
const char* example = {&a};