为何std::string的大括号初始化与圆括号初始化结果不同?
std::string圆括号与大括号初始化差异的原因分析
造成这种差异的核心原因是两种初始化方式调用了std::string的不同构造函数,且大括号初始化的匹配优先级更高。
圆括号初始化:std::string s(5, '=');
这里调用的是填充构造函数,其签名为:
basic_string(size_type count, CharT ch);
这个构造函数的作用是创建一个包含count个重复字符ch的字符串。因此代码会生成由5个'='组成的字符串,输出结果为=====,符合预期。
大括号初始化:std::string s{5, '='};
当使用大括号初始化时,编译器会优先匹配接受std::initializer_list<CharT>的初始化列表构造函数,签名为:
basic_string(std::initializer_list<CharT> ilist);
这里需要注意,std::string的CharT默认是char类型,因此参数5会被隐式转换为char(对应ASCII码为5的不可打印控制字符),而'='本身就是char类型。最终初始化列表包含两个字符:'\x05'(不可打印)和'=',因此生成的字符串长度为2,输出时只能看到可见的'=',前面的不可打印字符无法显示。
你可以通过以下代码验证这一点:
#include <iostream> #include <string> int main() { const std::string s{5, '='}; std::cout << "字符串长度:" << s.size() << "\n"; for (unsigned char c : s) { std::cout << "字符:'" << c << "',ASCII码:" << static_cast<int>(c) << "\n"; } return 0; }
输出结果会显示字符串长度为2,第一个字符的ASCII码是5,第二个是61(对应'=')。
内容的提问来源于stack exchange,提问作者av4625
相关产品推荐
相关产品推荐

