c ++中字符串的这两个不同初始化之间的区别是什么?

Lix*_*Bai 5 c++ string initialization

源代码

#include <iostream>
#include <string>
using namespace std;
int main(){
    std::string s{'a', 'b', '\0', 'c'};
    std::string s1="ab\0c";
    cout<<s.size()<<" "<<s<<endl;
    cout<<s1.size()<<" "<<s1<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而输出是

4 abc
2 ab
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会出现这种现象,这两种类型的初始化在C++中有什么区别吗?谢谢.

Ton*_*roy 8

因为s你匹配接受初始化字符列表的构造函数:这里是列表中的(9).本string类可以让你从构建任意数据串可能包括嵌入完全无效,因为在这种情况下做.初始化列表知道自己的长度,因此string捕获所有字符.

因为s1,匹配构造函数是上面链接列表中的(5),它接受一个const char*- 编译器允许char调用数组在调用该构造函数之前衰减到这样的指针,这意味着构造函数不知道该构造函数的长度.阵列.相反,它假设您故意使用ASCIIZ NUL终止的字符串约定(如"C"字符串),并扫描数据以找到第一个NUL,考虑到终结符.因此,字符串中只捕获了2个字符.

请注意,您可以使用...明确捕获4个字符

std::string s1 { "ab\0c", 4};
Run Code Online (Sandbox Code Playgroud)

...匹配列表中的构造函数(4).

Rakete1111在下面的评论说明了另一种创建这种字符串的新方法:auto s1 = "ab\0c"s;.