将字符串的填充构造函数与初始值设定项列表一起使用

Use string's fill constructor with an initializer list

本文关键字:列表 一起 字符串 填充 构造函数      更新时间:2023-10-16

我正在通读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{}};