繁体   English   中英

完美转发返回值,未定义的行为?

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

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