下面的代码不能用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
时,它也适用(当我在第一张地图中将int
替换为string
时):
map<string, A> m; // Does not work
map<int, A> m; // Works
答案 0 :(得分:7)
这不是一个错误,我解释原因:
1997年,在C ++标准完成之前不久,标准化委员会收到了一个问题:是否有可能创建不完整类型的标准容器?委员会需要一段时间才能理解这个问题。这样的事情甚至意味着什么,为什么你想要做到这一点呢?委员会最终解决了这个问题,并提出了问题的答案。 (这样你就不必一直跳到最后,答案是“不”。)但问题比答案更有趣:它指的是一种有用且未充分讨论的编程技术。标准库并不直接支持该技术,但可以使两者共存。
当您声明const std::map<int, A>&
时,A
仍然不完整,标准不强制实施者为不完整类型提供支持,因此如果您真的需要它并且您可以选择使用{{1} },您可以更改容器,并在不支持此功能的编译器中使用boost
代替标准容器。