我最近正在研究一個C++項目,並遇到了一個我不能完全理解的字符串構造函數的邊界案例。相關的代碼(其you can run here)如下:爲什麼此代碼將字符串初始化爲單個字符時調用initializer_list構造函數?
#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
字符的別名,具體的簽名會
string(std::initializer_list<char> init,
const Allocator& alloc = Allocator());
如何初始化{1, '*'}
,其中包含的元素int
類型都和類型爲char
,與此構造函數匹配?我的印象是,std::initializer_list
中的所有文字必須具有相同的字體 - 這是不正確的嗎?
請注意,縮小轉換有一個例外[對於常量表達式,其轉換後的結果將符合目標類型](https://stackoverflow.com/a/26974911/1708801) –