此 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>
。哪个,它不应该,,,但我不知道如何告诉它不要那样做:/
- 当
Data = map<int, NonCopyable>
MSVC 因同样的错误而失败,而其他人编译时。
- 如果我使用
Data = pair<int, NonCopyable>;
,所有编译器都可以,因此尝试复制构造对的容器可能是 unorderd_map
- 如果我构造大小正确的向量,它就会起作用。但是,我不能这样做。
谢谢
显然这是一个很早就知道的错误,结合了 MSVC STL 实现选择和标准规范...
我在提交错误报告时发现的问题,从 2018 年开始:
https://developercommunity.visualstudio.com/t/C2280-when-modifying-a-vector-containing/377449
- 此错误存在于 MSVC 2017 及之后的版本中。
- 似乎
不会被修复。 (参见@Alex Guteniev 的评论)
- 有一个解决方法:
vector<Wrapper<unordered_map<int, NonCopyable>>>
,其中 Wrapper 也是不可复制的类型。
以下代码在 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 - 如果我构造大小正确的向量,它就会起作用。但是,我不能这样做。
谢谢
显然这是一个很早就知道的错误,结合了 MSVC STL 实现选择和标准规范...
我在提交错误报告时发现的问题,从 2018 年开始: https://developercommunity.visualstudio.com/t/C2280-when-modifying-a-vector-containing/377449
- 此错误存在于 MSVC 2017 及之后的版本中。
- 似乎
不会被修复。 (参见@Alex Guteniev 的评论)
- 有一个解决方法:
vector<Wrapper<unordered_map<int, NonCopyable>>>
,其中 Wrapper 也是不可复制的类型。