【发布时间】:2019-04-09 15:57:51
【问题描述】:
使用 Visual Studio 2015 可以成功编译以下代码,但使用 Visual Studio 2017 编译失败。Visual Studio 2017 报告:
错误 C2280:“std::pair::pair(const std::pair &)”:试图引用已删除的函数
代码
#include <unordered_map>
#include <memory>
struct Node
{
std::unordered_map<int, std::unique_ptr<int>> map_;
// Uncommenting the following two lines will pass Visual Studio 2017 compilation
//Node(Node&& o) = default;
//Node() = default;
};
int main()
{
std::vector<Node> vec;
Node node;
vec.push_back(std::move(node));
return 0;
}
看起来 Visual Studio 2017 显式需要移动构造函数声明。是什么原因?
【问题讨论】:
-
您缺少
#include <vector>,但据我所知,该代码应该可以编译(并且它可以在例如 GCC 8.2 上编译)。你有最新最好的VS2017吗? -
我可以确认此代码失败,错误代码在 vs2017 15.4.2 下。
-
@rubenvb
将在内部包含 -
@DanielLangr、@Oliv、@Evg 都可以。查看 Vs2017 的矢量源代码,
vec.push_back或vec.reserve都调用_Umove_if_noexcept,内部调用_Uninitialized_copy由disjunction_v<is_nothrow_move_constructible<_Ty>, negation<is_copy_constructible<_Ty>>>决定 -
@finn 完全是实现定义的,实际上对于例如GCC 的 libstdc++。
标签: c++ visual-studio-2017 move-constructor