如果我有一个函数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
语句中的条件。
, §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语句的整个条件。因此代码是有效的。