![](/img/trans.png)
[英]Error with `std::vector< std::unique_ptr< T > >`
[英]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.