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

Posted

技术标签:

【中文标题】将字符串的填充构造函数与初始化列表一起使用【英文标题】:Use string's fill constructor with an initializer list 【发布时间】:2016-08-12 13:04:01 【问题描述】:

我正在阅读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】:

不,这是不可能的,标准specifies it:

如果T 是一个聚合类型 [...]; 否则,如果T 是字符数组[...]; 如果T 是一个聚合类型 [...]; 否则,如果 braced-init-list 为空 [...]; 否则,将分两个阶段考虑T 的构造函数: 所有将std::initializer_list 作为唯一参数或作为第一个参数(如果其余参数具有默认值)的构造函数都经过检查,并通过重载决议与std::initializer_list 类型的单个参数进行匹配

因此,将std::initializer_list 作为其第一个参数的std::string 的constructor 将始终在接受计数和字符的参数之前考虑。

在此构造函数中使用 list-initialization 的唯一方法是同时提供分配器:

std::string s6, 'z', std::string::allocator_type;

【讨论】:

以上是关于将字符串的填充构造函数与初始化列表一起使用的主要内容,如果未能解决你的问题,请参考以下文章

列表初始化使用啥构造函数

通过用户定义的函数向数据框添加列

在构造函数的初始化列表中初始化列表

Boost::unordered_map 与初始化列表?

类初始化与构造函数初始化列表的顺序

构造函数初始化