gpt4 book ai didi

c++ - libc++ 中可能存在错误?

转载 作者:可可西里 更新时间:2023-11-01 16:38:53 25 4
gpt4 key购买 nike

以下代码不使用 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在第二张 map 中它有效(当我将 int 替换为 string int 第一张 map 时):

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

最佳答案

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

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

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

关于c++ - libc++ 中可能存在错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12997156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com