将字符串的填充构造函数与初始值设定项列表一起使用
Use string's fill constructor with an initializer list
我正在通读Ivor Horton的"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
的"from c-string"构造函数,而不是其"fill"构造函数。
我知道我可以通过使用parens:来使用填充构造函数
string sleeping(6, 'z');
但为了满足我的好奇心,有没有办法像书中的例子一样,将fill构造函数与初始值设定项列表一起使用?
不,这是不可能的,标准规定了它:
- 如果
T
是聚合类型[…]- 否则,如果
T
是字符数组[…]- 如果
T
是聚合类型[…]- 否则,如果支持的init列表为空[…]
- 否则,分两个阶段考虑
T
的构造函数:
- 所有将
std::initializer_list
作为唯一参数的构造函数,或者如果其余参数具有默认值,则将其作为第一个参数的构造函数都将被检查,并通过针对std::initializer_list
类型的单个参数的重载解析进行匹配
因此,以std::initializer_list
作为第一个参数的std::string
的构造函数将始终被考虑在以计数和字符为第一个参数之前。
将列表初始化与此构造函数一起使用的唯一方法是还提供分配器:
std::string s{6, 'z', std::string::allocator_type{}};
相关文章:
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 与引用一起使用的列表,在用作成员时更改行为
- 与lambda一起使用虚拟继承在初始化列表中捕获此问题的GCC错误
- 将[]运算符与链接列表一起使用
- 当将 getline 与 int 一起使用时,如何修复"没有重载函数 'getline' 的实例与参数列表匹配"
- 如何将重新绑定与自定义分配器和自定义列表一起使用
- 如何将 2 个链表合并或合并在一起以创建新列表
- 常量变量初始化仅与成员初始化列表一起工作
- 将initalizer列表与从空基类继承的结构一起使用
- 具有与专用列表一起使用的参数列表的超类方法<superclass>
- 为什么 auto 关键字不能与指向函数的指针的初始化列表一起使用?
- 如何将列表语法与默认精神一起使用
- 使初始化列表与 C++ 中的继承一起使用
- 将 clang 3.1 与初始值设定项列表一起使用
- 将BOOST_FOREACH与恒定的侵入性列表一起使用
- 如何将 auto 与初始值设定项列表一起使用push_back
- 如何使用与成员初始化器列表一起使用的static_assert
- boost DFS不能与set垂直列表一起工作
- STL算法可以与循环列表一起使用吗?
- 将字符串的填充构造函数与初始值设定项列表一起使用