使用字符串的填充构造函数与初始化程序列表

问题描述:

我正在阅读通过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'); 

但只是为了满足我的好奇心,是有什么办法可以使用填充构造函数与初始化列表,如书中的例子吗?

+1

我不能相信,把它做成一本书。这是错误的。 – AndyG

没有,这是不可能的,标准specifies it

  • 如果T聚合类型 [...];
  • 否则,如果T是一个字符数组[...];
  • 如果T聚合类型 [...];
  • 否则,如果braced-init-list为空[...];
  • 否则,T的构造都认为,在两个阶段:
    • 称取std::initializer_list作为唯一的参数,或者作为第一个参数,如果其余的参数有默认值,所有构造进行检查,并匹配针对类型的单个参数重载std::initializer_list

所以的std::stringconstructor接受一个std::initializer_list作为它的第一个参数将永远被考虑之前,需要一个计数和一个字符。

使用列表初始化与此构造将是还提供分配器的唯一方法:

std::string s{6, 'z', std::string::allocator_type{}};