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

时间:2017-09-30 19:38:34

标签: c++ c++11 return rvalue-reference perfect-forwarding

我有一组函数,我使用模板特化来对某些值执行转换。但是,对于许多类型,我想通过不变的方式传递值。

要传递一个未更改的值,我将使用以下函数作为默认值:

template< typename arg >
arg&& convert( arg&& x )
{
    return std::forward<arg>( x );
}

这看起来很棒但是根据答案here,它有可能在如下声明中留下悬空参考:

int&& x = convert( 5 );

如果我只在函数参数中使用此内联,是否避免了这种风险?

例如,如果我执行类似......

之类的操作,是否会遇到未定义的行为?
void foo( int&& x )
{
    // Do something with x...
}

foo( convert( 5 ) );

1 个答案:

答案 0 :(得分:3)

  

例如,如果我执行类似......

之类的操作,是否会遇到未定义的行为?

没有。来自[class.temporary]的强调我的规则是:

  

在函数调用中绑定到引用参数的临时对象一直存在,直到完成包含该调用的完整表达式

我们的临时(5)绑定到函数调用中的引用参数(arg&&中的convert()),因此它会持续到完整表达式结束(是foo(convert(5)))的全部。所以这很好,只要你不允许引用x逃脱foo()

相关问题