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

Any workarounds for this MSVC specific vector<unordered_map<Trivial, NonCopyable>> bug?

以下代码在 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<Trivial, NonCopyable>。哪个,它不应该,,,但我不知道如何告诉它不要那样做:/

谢谢

显然这是一个很早就知道的错误,结合了 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<Wrapper<unordered_map<int, NonCopyable>>>,其中 Wrapper 也是不可复制的类型。