删除从函数返回的唯一ptr



如果我有一个函数source返回一个unique_ptr,我有一个函数sink以以下方式调用source,它工作[clang]。

但是行为是未定义的吗?还是一切都很顺利?

class Foo {
  ...
  bool isValid() { return true; }
  ...
}
std::unique_ptr<Foo> source() {
  auto foo = std::make_unique<Foo>();  // let's pretend this is C++14?
  /* ... initialize foo */
  return foo;
}
void sink() {
  if (source()->isValid()) {
    /* do something */
  }
  /* ... */
}

仅在该行上使用unique_ptr有效吗?对象理论上应该在什么时候被销毁?在那句话之后?在函数的最后?

是的,你的代码是有效的。由source返回的未命名的临时unique_ptr将在创建它的完整表达式的末尾被销毁,在本例中是if语句中的条件。

从N3337

, §12.2/3 (class.temporary)

…临时对象在(词法上)包含创建它们的点的完整表达式(1.9)求值的最后一步销毁. ...

§6.4/1 [stmt. 1]。select]if语句的语法是


选择语句从几个控制流中选择一个。
  selection-statement:
      if ( condition ) statement
      ...
  condition:
      expression
      ...

注意,return std::move(foo);不是必须的,你可以写return foo;, unique_ptr会自动移动

调用返回对象(而不是(n左值)引用)的函数的结果是临时的,因此它在完整表达式结束之前是有效的,在这种情况下,这是if语句的整个条件。因此代码是有效的。

相关内容

  • 没有找到相关文章

最新更新