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++中有什么区别吗?谢谢.
因为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;
.