8

vector<T>ベクトルのサイズを取るコンストラクターがあり、私が知る限り、それは明示的です。これは、次のコードがコンパイルに失敗するという事実によって証明できます

void f(std::vector<int> v);
int main()
{
    f(5);
}

私が理解できず、説明を求めているのは、次のコードがコンパイルされる理由です

std::vector<std::vector<int>> graph(5, 5);

コンパイルするだけでなく、実際にグラフのサイズを 5 に変更し、各要素を 5 つのゼロのベクトルに設定します。つまり、私が通常書くコードと同じことを行います。

std::vector<std::vector<int>> graph(5, std::vector<int>(5));

どのように?なんで?

コンパイラ: MSVC10.0


OK、MSVC のバグのようです (さらに別のバグです)。誰かが回答でバグについて詳しく説明できる場合(つまり、バグが再現された場合を要約する場合)、喜んで受け入れます

4

3 に答える 3

2

私には、このコンストラクターを呼び出しているように見えます:

template <class InputIterator>
vector (InputIterator first, InputIterator last,
  const allocator_type& alloc = allocator_type());

explicitコンストラクターは複数のパラメーターを取るため、どこに入るかわからない。int から vector への自動キャストではありません。

于 2013-05-07T20:43:17.363 に答える
1

これは実際には拡張機能であり、バグではありません。

呼び出されるコンストラクターは、2 つの反復子を受け取るコンストラクターです (ただし、実際には、署名は同じ型の任意の 2 つのパラメーターと一致します)。次に、2 つの反復子が実際に である場合の特殊化を呼び出します。これは、 の値を使用してint明示的に を構築し、そのコピーをベクトルに取り込みます。value_typeendbegin

于 2013-05-07T20:42:28.490 に答える