[英]Perfect forwarding of return values, undefined behaviour?
我有一组函数,我使用模板特化来执行某些值的转换。 但是,对于许多类型,我想通过不变的方式传递值。
要传递一个未更改的值,我将使用以下函数作为默认值:
template< typename arg >
arg&& convert( arg&& x )
{
return std::forward<arg>( x );
}
这看起来很棒但是根据这里的答案,它有可能在如下声明中留下悬空引用:
int&& x = convert( 5 );
如果我只在函数参数中使用此内联,是否避免了这种风险?
例如,如果我做类似的事情,我会遇到未定义的行为吗?
void foo( int&& x )
{
// Do something with x...
}
foo( convert( 5 ) );
例如,如果我做类似的事情,我会遇到未定义的行为吗?
不,从[class.temporary]强调我的规则是:
绑定到函数调用中的引用参数的临时对象将持续存在,直到包含该调用的完整表达式完成为止。
我们的临时( 5
)绑定到函数调用中的引用参数(对于convert()
arg&&
),因此它一直持续到完整表达式的结尾(全部是foo(convert(5))
)。 所以这很好,只要你不要引用x
escape foo()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.