[英]Returning unique_ptr<Object> as unique_ptr<const Object>
我有这样的方法:
std::unique_ptr<const Stats> Table::GetStats() const {
std::unique_ptr<Stats> result;
// ...
// Prepare stats. Under some conditions an exception may be thrown.
// ...
return result;
}
问题是它不能编译:
错误:无法将'std :: unique_ptr'左值绑定到'std :: unique_ptr &&'
我可以使用以下旁路进行编译:
return std::unique_ptr<const Stats>(result.release());
但这似乎有点过分。 我无法理解,从C ++的角度看第一段代码有什么问题? 有更优雅的解决方案吗?
你的代码应该可以正常工作,因为在return语句中 :
(强调我的)
(自C ++ 11以来)
如果expression是一个左值表达式并且满足复制精度的条件,或者满足条件,除了表达式命名一个函数参数,那么重载决策选择用于初始化返回值的构造函数执行两次: 首先好像表达式是一个rvalue表达式 (因此它可以选择移动构造函数或引用const的复制构造函数),如果没有合适的转换可用,则第二次执行重载解析,使用左值表达式(因此它可以选择复制构造函数)参考非常数)。
即使函数返回类型与表达式的类型不同,上述规则也适用(复制省略要求相同类型)
这意味着,即使result
是左值,它首先被视为右值,然后将选择以下构造函数 ,它可以将std::unique_ptr<Stats>
转换为std::unique_ptr<const Stats>
。
template< class U, class E > unique_ptr( unique_ptr<U, E>&& u ) noexcept;
似乎gcc4.9.2没有这种方式(即首先将表达式视为rvalue表达式); gcc 9工作得很好。
正如@RichardHodges评论的那样 ,您可以使用std::move
作为解决方法 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.