使用字符串的填充构造函数与初始化程序列表
问题描述:
我正在阅读通过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。
我知道我可以用括号使用填充构造:
string sleeping(6, 'z');
但只是为了满足我的好奇心,是有什么办法可以使用填充构造函数与初始化列表,如书中的例子吗?
答
没有,这是不可能的,标准specifies it:
- 如果
T
是聚合类型 [...];- 否则,如果
T
是一个字符数组[...];- 如果
T
是聚合类型 [...];- 否则,如果braced-init-list为空[...];
- 否则,
T
的构造都认为,在两个阶段:
- 称取
std::initializer_list
作为唯一的参数,或者作为第一个参数,如果其余的参数有默认值,所有构造进行检查,并匹配针对类型的单个参数重载std::initializer_list
所以的std::string
的constructor接受一个std::initializer_list
作为它的第一个参数将永远被考虑之前,需要一个计数和一个字符。
使用列表初始化与此构造将是还提供分配器的唯一方法:
std::string s{6, 'z', std::string::allocator_type{}};
我不能相信,把它做成一本书。这是错误的。 – AndyG