最近我在处理一个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());
包含int
类型和char
类型元素的初始化器{1,'*'}
是如何匹配此构造函数的?我原本以为std::initializer_list
中的所有字面量都必须具有相同的类型 - 难道这是不正确的吗?