我有一组函数,我使用模板特化来对某些值执行转换。但是,对于许多类型,我想通过不变的方式传递值。
要传递一个未更改的值,我将使用以下函数作为默认值:
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 ) );
答案 0 :(得分:3)
例如,如果我执行类似......
之类的操作,是否会遇到未定义的行为?
没有。来自[class.temporary]的强调我的规则是:
在函数调用中绑定到引用参数的临时对象一直存在,直到完成包含该调用的完整表达式 。
我们的临时(5
)绑定到函数调用中的引用参数(arg&&
中的convert()
),因此它会持续到完整表达式结束(是foo(convert(5))
)的全部。所以这很好,只要你不允许引用x
逃脱foo()
。