3

C++ プログラマーの皆さん、こんにちは。STL コンテナーについて簡単な質問があります。

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

このステートメントは、(適切なインクルードを使用して) 一部の C++ ソースファイルで使用すると正常にコンパイルされます。しかし

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

3 に答える 3

4

技術的には、コンテナー要素は割り当て可能である必要がありますが、std::listでは、リスト ノードが移動されることはほとんどないため、作成された後は、コピー (OK) または割り当て (エラーの原因となります) する必要はありません。

コンパイラが代入可能性をわざわざテストしない限り、多くのリスト操作をインスタンス化しても、技術的に合法でなくても、実際にはコンパイル エラーが発生しない可能性があります。

于 2009-08-02T14:33:49.450 に答える
4

コンテナー内のものは代入可能 (つまり、const ではない) である必要がありますが、コンパイラーは、実際に使用されない限り、すべてのテンプレート メソッドをインスタンス化する必要はなく、その時点で const の問題を発見できます。一部のコンパイラは、他のコンパイラよりもこれを行うのに優れています。

于 2009-08-02T14:35:17.513 に答える
2

STL は設計上、値型セマンティックをサポートするデータ型を処理します (コピー c-tor および演算子 =)。問題は const であり、含まれている値が値型のセマンティックをサポートしていません。

例えば:

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

リストの要素に値を割り当てることができないため、失敗します。

于 2009-08-02T14:36:42.923 に答える