我正在阅读Ivor Horton's "Beginning C++"。在第7章中,有一个关于字符串初始化的例子:
但是,可以使用任意数量的给定字符实例初始化字符串。您可以像这样定义和初始化困时
string
对象:string sleeping {6, 'z'};
string
对象sleeping
将包含"zzzzzz"
。字符串长度为6。
使用我的编译器Apple LLVM version 6.0 (clang-600.0.57)
,该示例无法按照描述工作。相反,它就好像我给了:
string sleeping {"\6z"};
使用string
's "from c-string" constructor, rather than its "fill" constructor。
我知道我可以通过使用parens来使用填充构造函数:
string sleeping(6, 'z');
但是为了满足我的好奇心,有没有办法将填充构造函数与初始化列表一起使用,如书中的示例所示?
答案 0 :(得分:2)
不,这是不可能的,标准specifies it:
- 如果
T
是聚合类型 [...];- 否则,如果
T
是字符数组[...];- 如果
T
是聚合类型 [...];- 否则,如果 braced-init-list 为空[...];
- 否则,
T
的构造函数分为两个阶段:
- 检查所有以
std::initializer_list
为唯一参数的构造函数,或作为第一个参数(如果其余参数具有默认值),并通过重载解析与std::initializer_list
类型的单个参数进行匹配/ LI>
因此std::string
std::initializer_list
std::string s{6, 'z', std::string::allocator_type{}};
将decimal
作为其第一个参数,将始终在计数和字符之前进行考虑。
使用此构造函数的 list-initialization 的唯一方法是提供分配器:
decimal x = 1e-20m, foo = 4.0m;
Console.WriteLine((x + foo)); // prints 4.00000000000000000001
Console.WriteLine((x - foo)); // prints -3.99999999999999999999
Console.WriteLine((x + foo) == foo); // prints false.