我习惯将 lambda 函数(和其他可调用函数)传递给模板函数并使用它们,如下所示
template <typename F>
auto foo (F && f)
{
// ...
auto x = std::forward<F>(f)(/* some arguments */);
// ...
}
我的意思是:我习惯于通过转发引用传递它们,并称它们为传递std::forward
.
另一位 Stack Overflow 用户争论(请参阅评论这个答案 https://stackoverflow.com/a/55784315/6022656)这样,调用函数两次或多次,这是危险的,因为当使用右值引用调用函数时,它在语义上无效并且可能存在危险(也可能是未定义的行为)。
我部分误解了他的意思(我的错),但剩下的疑问是以下内容是否正确bar()
函数(具有不容置疑的倍数std::forward
在同一个对象上)它是正确的代码或者它是(也许只是潜在的)危险。
template <typename F>
auto bar (F && f)
{
using A = typename decltype(std::function{std::forward<F>(f)})::result_type;
std::vector<A> vect;
for ( auto i { 0u }; i < 10u ; ++i )
vect.push_back(std::forward<F>(f)());
return vect;
}
前进只是有条件的举动。
因此,一般来说,多次转发同一事物与多次离开它一样危险。
未评估的前锋不会移动任何东西,因此这些不算数。
路由通过std::function
增加了一个问题:该推导仅适用于函数指针和具有单个函数调用运算符的函数对象,该函数不适用于&&
合格的。对于这些,如果都编译的话,右值和左值调用总是等效的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)