これは、文字列のベクトルを必要とする関数に int と文字列のペア (複合) 値を渡すときに期待することです。
さて、あなたの問題があります。
{...}
「複合値」ではありません。リストではありません。「これらの値を使用してオブジェクトを初期化する」と書かれています。問題のオブジェクトが集合体の場合、集合体の初期化が使用されます。問題のオブジェクトが非集約型の場合、その型の一致するコンストラクターと C++11 の波括弧初期化リストのさまざまな規則に基づいて、呼び出すコンストラクターが選択されます。
{10, "foo"}
2 つの値のリストと考えるべきではありません。これは、2 つの値を含む初期化子です。などと一緒に使用できますstd::pair<int, const char *>
。
std::vector
のコンストラクターが明示的でない理由は、まさにこの構成を許可するためです。単一引数のコンストラクターは明示的です。そうしないと、暗黙的な変換規則で次のことが可能になるからです。
std::vector<T> v = 5; //???
または、もっと重要なこと:
void Foo(const std::vector<T> &v);
Foo(5); //???
整数を暗黙のうちに s に変換できるようにしたくありませんstd::vector
。{}
ただし、初期化子を使用している場合は、構文を確認できるため、より広い範囲の「暗黙的な」変換を許可する方が合理的です。
引数が 1 つの場合、ユーザーが何を意味するのかが明確ではありません。{} 構文を使用すると、ユーザーが意味すること、つまりオブジェクトを初期化することが明確になります。
Foo({10, "foo"}); //Initializes the first argument given the values.