9

下面的代码没有用clang 3.1编译,使用libc++(不知道版本,目前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>'

我试图进一步隔离它,但这是我发现的最小示例。有趣的是,当我在第二张地图中替换为时(当我在第一张地图中替换string为int时):intintstring

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

1 回答 1

7

这并不完全是一个错误,我会向您解释原因:

1997 年,在 C++ 标准完成前不久,标准化委员会收到了一个疑问:是否可以创建类型不完整的标准容器?委员会花了一段时间才理解这个问题。这样的事情甚至意味着什么,你到底为什么想要这样做?委员会最终解决了这个问题并提出了这个问题的答案。(这样您就不必跳到最后,答案是“否”。)但是这个问题比答案更有趣:它指向了一种有用的、没有充分讨论的编程技术。标准库不直接支持该技术,但可以使两者共存。

当您声明const std::map<int, A>&,A仍然不完整并且标准不强制实施者提供对不完整类型的支持时,因此如果您确实需要它并且您可以选择使用boost,您可以更改容器并在不支持boost::container的编译器中使用标准容器代替不支持这个。

于 2012-10-21T11:22:29.860 回答