将string的fill构造函数与初始化列表一起使用

时间:2016-08-12 13:04:01

标签: c++ string

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

但是为了满足我的好奇心,有没有办法将填充构造函数与初始化列表一起使用,如书中的示例所示?

1 个答案:

答案 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.