2009-08-02 10 views
3

こんにちは仲間のC++プログラマ。 私は、私はあることを望んでいる、STLコンテナについての簡単な質問があります(適切な含んで)いくつかのC++ソースファイル名で使用する場合、この文は罰金コンパイルSTLコンテナ内のconstポインタ

std::list<std::string> l; 

を。しかし

std::list<const std::string> m; 

または

std::list<std::string * const> n; 

は、GCC(gccのバージョン4.0.1(されたApple Inc. 5484を構築する))を使用する場合、コンパイルに失敗します。 しかし、Visual Studio 2008 C++コンパイラを使用すると、苦情は発生しません。

STLコンテナの要素はAssignableである必要があります。 VCの実装にSTLのバグがありますか(私は言うつもりはありません)、あるいは彼らはAssignableの別のコンセプトを使用していますか?

答えて

4

技術的には、コンテナ要素を割り当てる必要がありますが、std::listでは、リストノードはほとんど移動しないため、作成(OK)または割り当て(エラーが発生する)する必要はありません。

コンパイラが割り当て可能性をテストする方法から外れない限り、多くのリスト操作をインスタンス化すると、実際には合法的ではなくてもコンパイルエラーは発生しません。

+0

私は、カーブワイズを学ぶいくつかのコンパイラを使用するのに恩恵を受けると思います。しかし、私はむしろ、そのような滑りやすい課題を指す静的分析ツールを持っています。 – msi

+0

[STLport] [http://www.stlport.org/]をご覧ください。私はそれをもう一度インストールして、これをキャッチする必要があります。 –

4

コンテナ内のものはアサイン可能(constではなく)でなければなりませんが、実際に使用されていない限り、コンパイラはすべてのテンプレートメソッドをインスタンス化する必要はありません。いくつかのコンパイラは他のコンパイラよりも優れています。

+1

+1、 "テンプレートパラメータを割り当てる必要があります"という重要なポイントは、プログラムの制約です。コンパイラがそうでないかどうかを伝える必要はありません。 –

2

STLは、値型セマンティック(コピーc-torおよび演算子=)をサポートするデータ型を処理します。問題はconstであり、これは含まれた値が値型の意味論をサポートしないようにします。例えば

:あなたは、リストの要素に値を代入することはできませんので、

std::list<const std::string> m; 

は失敗します。

+0

私はconst/Assignable問題を理解しています。しかし、私の疑問に合わせてコードを使用すると、VSがエラーメッセージを表示しないのはなぜですか? – msi

関連する問題