3

MS Connectサイトで1つの質問に対する回答を読んでいるときに、回答の次の部分に気づきました。

これは、私が知っている標準ライブラリのいくつかの重大な変更の1つです(他の主要な変更は不変のセットと2Dベクトルの構築です)。

STLの実装に取り​​組んでいるのはMSの従業員からのものであるため、回答は高い確率で正当であると見なすことができます。

それで、誰かが彼が正確に何を指しているのか知っていますか?

4

1 に答える 1

4

私はステファンにメールを送り、彼が何について話しているのか尋ねました。これが彼の答えです(フォーマット用に編集されています)。彼がここに答えを投稿することを計画していたようには聞こえませんでした。もしそうなら、私はこのコピーを削除します。

ここから下のすべてはステファンが話している。

私はこれを参照していました:

#include <vector>
using namespace std;

int main() {
    vector<vector<int>> v(11, 22);
}

VC10 SP1(C ++ 03に続く)でコンパイルされますが、VC11 RTM(C ++ 11に続く)ではコンパイルされません:[snip error message dump]

C ++ 03 23.1.1 [lib.sequence.reqmts] / 9のコメント

この節と節21で定義されているすべてのシーケンスについて:
—コンストラクター
template <class InputIterator> X(InputIterator f, InputIterator l, const Allocator& a = Allocator())
は次と同じ効果を持ちます:
X(static_cast<typename X::size_type>(f), static_cast<typename X::value_type>(l), a)
ifInputIteratorが整数型です。

これはに変換vector<vector<int>> v(11, 22)されvector<vector<int>> v(static_cast<size_t>(11), static_cast<vector<int>>(22))、有効です。(のサイズコンストラクターstatic_castなどの明示的なコンストラクターを呼び出すことができます。)vector

C ++ 11 23.2.3 [sequence.reqmts] / 14によると:

この句および句21で定義されているすべてのシーケンスコンテナについて:
—コンストラクタが入力イテレータとして適格でない
template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())
型で呼び出された場合、コンストラクタは過負荷解決に参加してはなりません。InputIterator

これにより、(InIt、InIt)ctorが過負荷解決から削除されます。それは去ります(size_type n, const T& value)、どこにTありますかvector<int>。ただし、これは暗黙的に22一時的なものに変換しようとしますvector<int>(にバインドするためconst T&)。のサイズコンストラクタの明示性はvectorそれを禁じています。

他のSOの質問を読んで、これは別の問題です。

STL

于 2012-09-14T21:54:40.750 に答える