使用std::string进行花括号初始化

4
我最近越来越多地使用花括号初始化。虽然我发现在这种情况下与圆括号初始化有所不同,但我想知道原因。
如果我这样做:
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


3
那是一个由两个字符组成的字符串吗?第一个是不可打印的字符0x05(ASCII ENQ),第二个是字符=?换句话说,当你说“我得到了=”时,你只显示了=,而在它之前的0x05字符是不可打印的,我的理解正确吗? - Wyck
3
那是一个由两个字符组成的字符串吗?一个是不可打印的字符0x05(ASCII ENQ),另一个是字符=?换句话说,当你说“我得到了=”时,你只显示了=,而在它之前的0x05字符是不可打印的,我理解得对吗? - undefined
3
完美。我想为将实际字符粘贴到问题中的做法表示赞赏并点赞。它们只是无法通过Stack Overflow软件传递。那些有能力这样做的人可以编辑问题并看到原始文本,其中包含5个字符确实完整保留。 - Wyck
3
太好了。我想要给予赞赏和点赞,因为你在问题中粘贴了实际的字符。可惜这些字符无法通过Stack Overflow软件传递。那些有编辑权限的人可以编辑问题并查看原始文本,确保这5个字符确实完整无误。 - undefined
2
也许在这种情况下,使用一张截图来展示实际效果是可以接受的。 - Julian
显示剩余7条评论
1个回答

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

使用构造函数,接受一个count和字符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() );

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接