繁体   English   中英

std :: vector <std::map<uint64_t, std::unique_ptr<double> &gt;&gt; VS2017中的编译错误

[英]std::vector<std::map<uint64_t, std::unique_ptr<double>>> compilation error in VS2017

我试图编译下面的代码:

std::vector<std::map<uint64_t, std::unique_ptr<double>>> processedIntervals;
std::map<uint64_t, std::unique_ptr<double>> empty_map{};
std::map<uint64_t, std::unique_ptr<double>>&& empty_map_ref = std::move(empty_map);
processedIntervals.emplace_back(empty_map_ref);

错误是:

Error C2280 'std::pair<const _Kty,_Ty>::pair(const std::pair<const _Kty,_Ty> &)':
attempting to reference a deleted function TTTT C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.10.25017\include\xmemory0 840 

该代码可以在VS2015中正确编译。 std::pair的相同代码(而不是std::map )运行良好。

为什么VS2017无法编译?

这是预期的行为。 它可能是违反直觉的,但是empty_map_ref尽管是类型,但它是一个左值-因此您需要move它:

processedIntervals.emplace_back(std::move(empty_map_ref));

因为代码是错误的。 正确的是

processedIntervals.emplace_back(std::move(empty_map_ref));

或直接

processedIntervals.emplace_back(std::move(empty_map));

甚至

processedIntervals.emplace_back();

由于empty_map_ref是一个命名对象,因此必须显式调用std::move以确保右值引用。 这与move构造函数相同:

struct foo 
{
  std::unique_ptr<something> ptr;
  foo(std::unique_ptr<something>&&p) // constructor from rvalue ref
   : ptr(std::move(p))               // ptr(p) would fail exactly as in your code
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM