【问题标题】:Any workarounds for this MSVC specific vector<unordered_map<Trivial, NonCopyable>> bug?此 MSVC 特定向量<unordered_map<Trivial, NonCopyable>> 错误的任何解决方法?
【发布时间】: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

标签: c++ move stdvector


【解决方案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 也是不可复制的类型。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多