此 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<Trivial, NonCopyable>
。哪个,它不应该,,但是我不知道告诉它不要这样做:/
Data = map<int, NonCopyable>
MSVC 失败并出现同样的错误,而其他人编译时。
如果我使用Data = pair<int, NonCopyable>;
,所有编译器都可以,因此尝试复制构造对的容器可能是 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 及更高版本中存在此错误。 似乎给出的解释: https://www.reddit.com/r/cpp/comments/6q94ai/chromium_windows_builds_now_use_clangcl_by_default/dkwdd8l/
有一种解决方法:vector<Wrapper<unordered_map<int, NonCopyable>>>
,其中 Wrapper 也是不可复制的类型。
【讨论】:
不完全是它不会被修复。对于unorederd_map
,可以进行修复,请参阅github.com/microsoft/STL/issues/1036#issuecomment-661742697以上是关于此 MSVC 特定向量<unordered_map<Trivial, NonCopyable>> 错误的任何解决方法?的主要内容,如果未能解决你的问题,请参考以下文章
当使用向量作为键时,C++ unordered_map 失败
C++ 将所有元素从向量复制到 map / unordered_map 的最佳方法