此 MSVC 特定向量<unordered_map<Trivial, NonCopyable>> 错误的任何解决方法?

Posted

技术标签:

【中文标题】此 MSVC 特定向量<unordered_map<Trivial, NonCopyable>> 错误的任何解决方法?【英文标题】:Any workarounds for this MSVC specific vector<unordered_map<Trivial, NonCopyable>> bug? 【发布时间】:2022-01-24 02:24:34 【问题描述】:

以下代码在 MSVC 上确实失败,但在 GCC 和 Clang 上编译,godbolt

#include <unordered_map>
#include <vector>
using namespace std;

struct NonCopyable

    NonCopyable() = default;
    NonCopyable(NonCopyable const &) = delete;
    NonCopyable(NonCopyable &&) = default;
;

int main()

    using Data = unordered_map<int, NonCopyable>;

    vector<Data> vec;

    vec.reserve(3);     // error
    vec.resize(3);      // error
    vec.emplace_back(); // error

    return 0;

这是我在进行项目时偶然发现的案例的简化版本。我从一开始就使用 MSVC,所以我更喜欢一种解决方法(如果可能的话)而不是更改编译器。

据我从错误消息中了解到,vector 尝试复制构造 pair&lt;Trivial, NonCopyable&gt;。哪个,它不应该,,但是我不知道告诉它不要这样做:/

Data = map&lt;int, NonCopyable&gt; MSVC 失败并出现同样的错误,而其他人编译时。 如果我使用Data = pair&lt;int, NonCopyable&gt;;,所有编译器都可以,因此尝试复制构造对的容器可能是 unorderd_map ???? 如果我用正确的大小构造向量,它就可以工作。但是,在我的情况下,我不能这样做。

谢谢

【问题讨论】:

您可以将此问题报告给github.com/microsoft/STL 一个有趣的注释,我的 vs2019 的第一行错误是 emplace_back 而不是调整大小或保留。 您从 MSVC 收到哪些错误消息?将它们编辑到问题中(它可以帮助遇到此问题的其他人找到您的问题)。 @Genjutsu,问题已经存在:github.com/microsoft/STL/issues/1036 【参考方案1】:

显然,这是一个由 MSVC STL 实现选择和标准规范组合而成的长期已知错误...

我从 2018 年开始提交错误报告时发现的问题: https://developercommunity.visualstudio.com/t/C2280-when-modifying-a-vector-containing/377449

MSVC 2017 及更高版本中存在此错误。 似乎 不会 会被修复。 (见@Alex Guteniev 的评论)

给出的解释: https://www.reddit.com/r/cpp/comments/6q94ai/chromium_windows_builds_now_use_clangcl_by_default/dkwdd8l/

有一种解决方法:vector&lt;Wrapper&lt;unordered_map&lt;int, NonCopyable&gt;&gt;&gt;,其中 Wrapper 也是不可复制的类型。

【讨论】:

不完全是它不会被修复。对于unorederd_map,可以进行修复,请参阅github.com/microsoft/STL/issues/1036#issuecomment-661742697

以上是关于此 MSVC 特定向量<unordered_map<Trivial, NonCopyable>> 错误的任何解决方法?的主要内容,如果未能解决你的问题,请参考以下文章

遍历向量的 unordered_map

从 unordered_map 内的向量中删除元素

当使用向量作为键时,C++ unordered_map 失败

C++ 将所有元素从向量复制到 map / unordered_map 的最佳方法

如何使用 unordered_mp 向量插入或 push_back

使用 unordered_map 值初始化指向向量的指针时出错