【问题标题】:How to return an object pointer with conditional expression?如何使用条件表达式返回对象指针?
【发布时间】:2019-11-13 13:25:55
【问题描述】:

https://www.youtube.com/watch?v=LFv7XwgsdLY&t=1620s25:40

class Foo 应该以两种方式返回:

  • 如果
if(condition) 
   return foo1 
else 
    return foo2;
  • 带条件表达式
return condition ? food(foo1) : std::move(foo2);

如果Foounique_ptr,我想检查Foo 是否不是nullptr 然后返回foo,如果是nullptr 返回nullptr。让我们暂时忘记有人可能想要删除该指针。

哪种方式合适?

Foo* getFoo()
{
    //get because foo is a unique ptr
    return foo ? foo.get() : nullptr;
}
Foo* getFoo()
{
    return foo ? std::move(foo.get()) : nullptr;
}

【问题讨论】:

  • 如果foo 不拥有对象,foo.get() 返回nullptrreturn foo ? foo.get() : nullptr; 因此没有任何意义,因为您可以简单地写成return foo.get();
  • 另外,请注意std::move(foo.get()) 也没有任何意义,因为foo.get() 按值返回一个指针。你只是从一个右值制作一个右值。此外,复制和移动基本类型(例如指针)的内容具有相同的效果(不涉及复制/移动构造函数/赋值运算符)。
  • 是的,这是有道理的。谢谢。

标签: c++ memory smart-pointers return-value-optimization


【解决方案1】:

您不需要任何类型的分支。你可以使用

Foo* getFoo()
{
    return foo.get();
}

这是可行的,因为如果foo 持有nullptrget 将返回nullptr

【讨论】:

  • @BrodaJarek3 同样的事情。如果是nullptr,可以直接退货。
  • 你不会为整数写if (x == 0) return 0; else return x;,那么为什么要为指针写呢?该视频是关于返回两个不同对象之一,而不是返回一个可能具有不同值的对象。
猜你喜欢
  • 2012-10-18
  • 2020-05-15
  • 2020-11-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多