使用 std::string 的大括号初始化

Curly Brace Initialisation with std::string

提问人:av4625 提问时间:6/8/2023 最后编辑:av4625 更新时间:6/8/2023 访问量:119

问:

我最近越来越多地使用大括号初始化。尽管在这种情况下,我发现圆括号初始化有所不同,但我想知道为什么。

如果我这样做:

const std::string s(5, '=');
std::cout << s << std::endl;

我得到:

=====

这是我所期望的。但如果我这样做:

const std::string s{5, '='};
std::cout << s << std::endl;

我得到:

=

为什么会这样?

编辑:为了任何看到这个的人的利益。在第二个输出之前有一个不可打印的字符。它只是没有显示在 stackoverflow 上。看来:=

enter image description here

C++ stdstring 大括号

评论

1赞 Mooing Duck 6/8/2023
{}在从任何类型的列表(包括空列表或一个项目)构造时,应使用。 应该用于所有“其他”构造函数。()
3赞 Wyck 6/8/2023
这是由两个字符组成的字符串吗?一个是不可打印的字符 0x05 (ASCII ENQ),第二个是字符?换句话说,当你说“我明白”时,你只是在它无法打印之前显示和0x05字符,我理解正确吗?===
1赞 av4625 6/8/2023
@Wyck 对不起,是的,前面有一个不可打印的字符,它显示为一个框=
3赞 Wyck 6/8/2023
完善。我想为将实际角色粘贴到问题中而点赞和点赞。他们只是不通过 Stack Overflow 软件。有能力的人可以编辑问题并查看带有 5 个字符的原始文本确实完好无损。
2赞 Julian 6/8/2023
在这种情况下,也许屏幕截图是可以接受的,以演示它的实际外观。

答:

5赞 Ted Lyngmo 6/8/2023 #1

const std::string s(5, '=');

使用构造函数进行计数和字符 ch(以及分配器):

constexpr basic_string( size_type count, CharT ch,
                        const Allocator& alloc = Allocator() );

const std::string s{5, '='};

使用

constexpr basic_string( std::initializer_list<CharT> ilist,
                        const Allocator& alloc = Allocator() );

这意味着它将被转换为 a,因此您的字符串将具有大小 .第一个字符将具有值,另一个字符将是 。5char25=