9

次のコードは、libc++ を使用して、clang 3.1 でコンパイルされません (Xcode に付属している現在のバージョンがわからない)。他の標準ライブラリで問題なく動作します。コードにエラーがありますか、それとも libc++ のバグですか?

#include <map>
#include <string>
using namespace std;

struct A {
  A(const map<int, A>& m) {}
};

struct B {
  map<string, A> m;
};

私が見ているエラーは次の<utility>とおりです。

/usr/lib/c++/v1/utility:241:64: No member named 'value' in 'std::__1::is_nothrow_copy_constructible<A>'

私はそれをさらに分離しようとしましたが、これは私が見つけた最小限の例です. 興味深いことに、2 番目のマップで置き換えると機能します (最初のマップを int で置き換える場合も同様stringです) 。intintstring

map<string, A> m; // Does not work
map<int, A> m; // Works
4

1 に答える 1

7

これは正確にはエラーではありません。その理由を説明します。

C++ 標準が完成する少し前の 1997 年、標準化委員会は質問を受けました。委員会がその質問を理解するのにしばらく時間がかかりました。そのようなことは何を意味するのでしょうか。委員会は最終的にそれを解決し、質問に対する答えを見つけました。(最後までスキップする必要がないように、答えは「いいえ」です。) しかし、質問は答えよりもはるかに興味深いものです。それは、有用で十分に議論されていないプログラミング手法を示しています。標準ライブラリはその手法を直接サポートしていませんが、2 つを共存させることができます。

を宣言しているときconst std::map<int, A>&Aはまだ不完全であり、標準は実装者に不完全な型のサポートを提供することを強制していません。そのため、本当に必要で、 を使用するオプションがある場合はboost、コンテナーを変更してboost::container、標準コンテナーの代わりに使用することができます。これをサポートしません。

于 2012-10-21T11:22:29.860 に答える