为什么此代码将字符串初始化为单个字符调用initializer_list构造函数
Why does this code to initialize a string to a single character call the initializer_list constructor?
我最近正在从事一个C 项目,并遇到了一个我无法完全理解的字符串构造函数的边缘箱。相关代码(您可以在此处运行)如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
string directParens(1, '*');
string directBraces{1, '*'};
string indirectBraces = {1, '*'};
cout << directParens.size() << endl; // 1
cout << directBraces.size() << endl; // 2
cout << indirectBraces.size() << endl; // 2
return 0;
}
字符串的支撑键式版本最终在其中有两个字符,即具有数字值1的char
,其次是星形。
我不明白字符串的支撑键化版本为何调用initializer_list
构造函数,而不是构造函数的构造函数。initializer_list
构造函数具有此签名:
basic_string(std::initializer_list<CharT> init,
const Allocator& alloc = Allocator());
鉴于string
是basic_string
char的别名,特定的签名将为
string(std::initializer_list<char> init,
const Allocator& alloc = Allocator());
初始化器{1, '*'}
如何包含类型int
和类型char
的元素,与此构造函数匹配?我的印象是std::initializer_list
中的所有文字都必须具有相同的类型 - 这是不正确的吗?
initializer {1,'*'}如何包含类型int和类型char的元素,匹配此构造函数?
因为文字1
和字符'*'
均可转换为char
,而无需使用狭窄的转换。因此,它们有资格称为initializer_list<char>
构造函数。initializer_list
构造函数始终在使用列表初始化时具有优先级。如果可以从参数调用initializer_list
构造函数,则将其。
切勿使用带有容器的支撑式列表,除非您打算将列表中的元素为容器的 elements 。如果您打算将它们作为构造函数参数,请使用构造函数。
相关文章:
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 自定义 std::fstream,std::filebuf 的溢出和下溢函数未为每个字符调用
- 字符::未调用 BeginPlay()
- 第 5 行:字符 54:错误:调用"min(int,std::__cxx11::basic_string<char>::size_type)"没有匹配函数
- 使用 %s 调用 printf 并传递零长度的字符*是未定义的行为吗?
- 除了字符串或宏调用之外,是否存在任何情况,其中"(<"是有效的字符流?
- 当C 中的系统调用conconculables时,参数字符串中的字符损失
- UNIX API 调用:使用 read() 函数打开文件并将其打印到屏幕上会增加额外的随机字符
- 调用 printf 时隐式转换为字符*
- CIN.IGNORE删除第一个字符的第二次函数被调用
- C++ 错误:与调用<类构造函数(字符*&、字符*&、字符*&、字符*&)不匹配
- 为什么此代码将字符串初始化为单个字符调用initializer_list构造函数
- 从 C# 调用 C++ dll 将返回垃圾字符
- 使用字符数组调用 scanf_s()
- 在调用toupper()、tolower()等之前,是否需要转换为无符号字符
- 从DLL文件调用消息框函数时出现奇怪的字符
- C++ 错误:对 '(std::string {aka std::basic_string}) (<char>无符号整数、字符)的调用不匹配
- 通过引用字符 2 维调用字符串不起作用
- 调用使用字符数组的类函数 (C++)
- 在 C++ 中将字符串的元素作为字符调用