web-dev-qa-db-ja.com

なぜこのコードは型の不一致エラーなしでコンパイル(C ++ 11)するのですか?

std::vector<char> p = {"abc", "def"};

"abc"および"def"charではありません。なぜコンパイラはこの型の不一致に関するエラーを出さないのですか?

45
ebi

initializer_list<char>を取るvectorのコンストラクターを呼び出していません。あなたが言ったように、あなたはcharsのリストを渡していないので、そのコンストラクタは実行可能ではありません。

ただし、vectorには constructor もあり、要素の範囲への反復子を取ります。

template< class InputIt >
vector( InputIt first, InputIt last,
        const Allocator& alloc = Allocator() );

残念ながら、2つの引数はそれぞれ暗黙的にchar const *に変換されるため、このコンストラクターは一致します。ただし、コンストラクタに渡される開始イテレータと終了イテレータが有効な範囲ではないため、コードの動作は未定義です。

57
Praetorian