繁体   English   中英

返回unique_ptr <Object> as unique_ptr <const Object>

[英]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.

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