You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:15:04