C++11字符串初始化

7

我需要创建一个由100个 A 字符组成的字符串。

为什么以下代码

std::string myString = {100, 'A'};

与之前的结果不一样

std::string myString(100, 'A');

?


1
对于通用初始化,只需将“()”替换为“{}”。您应该执行std::string myString{100,'A'}; - Edward Strange
1
@CrazyEddie 但这是一个例子,括号中的更改将彻底改变程序的行为。initializer_list构造函数优先于其他所有构造函数。在这里,=号没有任何区别。查看演示 - juanchopanza
1
@CrazyEddie 这有什么区别吗?结果仍然与 std::string myString(100, 'A'); 不同。 - Praetorian
@juanchopanza - 呜呜。好的。感谢你“有用”的纠正。 - Edward Strange
2个回答

14
std::string myString = {100, 'A'};

使用初始化列表进行初始化。它创建一个包含两个字符的字符串:一个编码为100,另一个是'A'

std::string myString(100, 'A');

调用以下构造函数:

string (size_t n, char c);

使用100个'A'创建一个字符串


5
正式来说,第一个参数仅仅是一个值为100的char;如果你的系统将char类型的值视为ASCII码,那么它就是ASCII码。虽然这很常见,但C++语言定义并不要求如此,也有一些系统不符合这个规定。 - Pete Becker
@Fanael - 我不知道这有多难,但这是一个经常被忽视的重要点,仅仅编辑文本并不能提醒人们注意它。 - Pete Becker
@PeteBecker:这是否意味着std::string s = { 100, 'A' };是未定义的行为?这难道不会使得在C++11中创建统一初始化语法的大部分意图失效吗? - Daniel Frey
3
@DanielFrey说:这不是未定义行为。CHAR_MAX的最小值必须至少为127,因此100是char类型的有效值,无论它代表什么字形(如果有的话--并非所有char类型的值都必然代表字符,因此理论上你可能在打印它时遇到麻烦)。 - Steve Jessop
@DanielFrey - char 是一种算术类型和字符表示,将 100 赋值给 char 对象没有任何问题。 - Pete Becker

1

第一个将它初始化为值100和A,第二个调用了std::string的构造函数重载。


3
是的,那个构造函数会给你一个包含100个 'A' 字符的字符串。 - juanchopanza

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