【发布时间】: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