2012-04-04 8 views
9

が、この考えてみましょう。しかし、llvm(llvm on linux)やlinux(linux上のgcc)でコンパイルしていないので、 "inc *に互換性のない型const intから代入する"のようなエラーが出ます。私は解決策を探していない - 私は2番目のパラメータが不必要であること、またはstatic_castがエラーを修正することを知っている。ポインタのベクトルを明示的に初期化すると、変換エラーが発生しますか?</p> <pre><code>std::vector<int*> v(1, 0); </code></pre> <p>これは、VC++ 10(でも最大警告レベルで警告なし)と罰金コンパイル:

ゼロは、暗黙的に任意のポインタ型に変換可能であると考えました。何がありますか?私は、次の操作を行うことができます

int* i = 0; 
int* const& ii = 0; 
const int t = 0; 
i = t; 

私はベクトルのコンストラクタの署名がvector<int*>のために拡張したとき修正int* const&なりconst T&かかることを理解できますか?誰かがここで何が起こっているのか、VC++かVC++コンパイラが正しいかどうかを説明できますか?

+0

'0'ではなく' nullptr'を試してください。 – ildjarn

+1

これをC++ 03またはC++ 11のプログラムとしてコンパイルしていますか? –

+0

質問には関係ありませんが、なぜ、ビンネーが避けなければならないとしたら、生のポインタを使用していますか?(http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-スタイル)? –

答えて

2

g ++のように見えますが実際は間違っています。 - コンストラクタテンプレートX(InputIteratorのF、 InputIteratorリットル、CONSTアロケータ&

:この句および節21に定義されたすべての配列について

:C++ 98 23.1.1/9を参照a = Allocator())

は、 の効果をと同じにする必要があります(InputIteratorが の整数型の場合)。 InputIterator、この場合にはご例えばintなるので、整数型になるコンストラクタのテンプレートパラメータであることを

注意。 g ++ライブラリは実際には、vectorに格納されている型も同様にすべての場合を処理する特定のコードを持っており、それらはすべて正しく動作します。この場合、0を使用したのは、標準で規定されているstatic_castが実際に合法になるからです。私は標準が同等でなければならないというコードをコンパイルしようとしました。そして、g ++ 4.5でコンパイルします。

+0

良い仕事。 'std :: vector v(1,0);'うまくコンパイルします。私はここでMSが正しいとは思わなかった。 – Tabber33

+0

これは実装が[Library Issue#438](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#438)を考慮しているかどうかによって異なります。これは、仕事。提案された解決策はTabberの失敗に一致する 'X(static_cast (f)、l、a)'です。 C++ 11では[Defect Report#1234](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#1234)の代わりに、別の結果が表示されました。 –

2

std::vectorは、コンパイラがintとしてInputIteratorを差し引いた場合、(!)あなたのパラメータ01からこの署名

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

と厄介なコンストラクタを持っている良いフィットすることが、私たちがやりたいことはありません。

私は、C++ 11では、パラメータが実際にイテレータであるかどうかを判断するためにコンパイラが必要と思うと思います。 C++ 03では、おそらくsize_type(1)int(0)となってしまい、問題が発生します。

整数のリテラル0はNULLポインタに変換されますが、値0のintは変換されません。

+0

ありがとうございます。あなたは正しいです - より密接にエラーを見て、私は今テンプレートのコンストラクタのインスタンス化がエラーツリーのルートにあったことを確認します。 VC++(プリC++ 11サポートさえも)がここで意図したコンストラクタを呼び出すための余分な "トラブル"に遭遇し、そうするための言語規則に違反しているのはなぜか疑問に思うだけです(テンプレート化されたコンストラクタはより良い一致です)。 – Tabber33

+0

@Bo Perssonもし私が23.1.1/9を正しく読んでいれば、これは正解ではありません。g ++は実際には特別なケースを見逃していました。 –

関連する問題

 関連する問題