私は最近、C++プロジェクトに取り組んでいましたが、私が完全に理解できない文字列コンストラクタを使って端をつきました。関連するコードは以下の通りである(you can run here):文字列を1文字に初期化するこのコードは、なぜ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;
}
ストリングのブレース初期化バージョンはその中に2つの文字を有する結局、星続く数値1と、すなわち、char
。
文字列の中括弧で初期化されたバージョンが、サイズと文字を取り入れたコンストラクタではなく、initializer_list
コンストラクタを呼び出す理由がわかりません。 initializer_list
コンストラクタは、この署名を有する:string
はbasic_string
チャーの別名であることを考慮
basic_string(std::initializer_list<CharT> init,
const Allocator& alloc = Allocator());
、特定の署名タイプint
の要素の両方を含む初期{1, '*'}
が、どのように
string(std::initializer_list<char> init,
const Allocator& alloc = Allocator());
であろうとこのコンストラクタに一致するchar
タイプの?私はstd::initializer_list
のすべてのリテラルが同じタイプでなければならないという印象を受けました - それは間違っていますか?
注:コンバージョン[変換後の結果がターゲットタイプに適合する定数式の場合]は例外です(https://stackoverflow.com/a/26974911/1708801) –