此 MSVC 特定矢量<unordered_map<琐碎、不可复制>>错误的任何解决方法?



以下代码在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>;,那么所有编译器都可以,所以试图复制构造对的容器可能是无序映射🤔
  • 如果我用正确的大小构造向量,它就会起作用。然而,就我而言,我不能这样做

感谢

显然,这是一个长期已知的错误,结合了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也是不可复制的类型

最新更新