libc ++中可能存在的错误?

luc*_*nte 9 c++ std c++11 libc++

下面的代码不能用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;
};
Run Code Online (Sandbox Code Playgroud)

我看到的错误是<utility>:

/usr/lib/c++/v1/utility:241:64: No member named 'value' in 'std::__1::is_nothrow_copy_constructible<A>'
Run Code Online (Sandbox Code Playgroud)

我试图进一步隔离它,但这是我发现的最小例子.有趣的是,当我更换stringint第二映射它的工作原理(也当我更换intstringINT第一图):

map<string, A> m; // Does not work
map<int, A> m; // Works
Run Code Online (Sandbox Code Playgroud)

Big*_*oss 7

这不是一个错误,我解释原因:

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

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

  • 另外,我找到了你的第一段的来源.如果您在答案中将其链接起来会有所帮助;)http://www.drdobbs.com/the-standard-librarian-containers-of-inc/184403814 (2认同)