何时应该转发函数调用
When should I std::forward a function call?
我在Effective Modern c++ 中看到的代码片段巧妙地实现了创建函数定时器:
auto timeFuncInvocation =
[](auto&& func, auto&&... params)
{
start timer;
std::forward<decltype(func)>(func)(
std::forward<decltype(params)>(params)...);
stop timer and record elapsed time;
};
我的问题是关于std::forward<decltype(func)>(func)(...
- 根据我的理解,我们实际上是将函数转换为其原始类型,但是为什么需要这样做?看起来一个简单的调用就可以完成这个任务。
- 是否有其他情况下,我们使用完美转发进行函数调用?
这看起来是在lambda表达式中使用熟悉的模板语法的一个很好的用例,如果我们想让计时器类型成为编译时间常数的话。
对std::forward<decltype(func)>(func)(...)
所做的更好的描述是保留传递给lambda的参数的值类别。
考虑以下具有refqualified operator()
重载的函子。
struct foo
{
void operator()() const &&
{ std::cout << __PRETTY_FUNCTION__ << 'n'; }
void operator()() const &
{ std::cout << __PRETTY_FUNCTION__ << 'n'; }
};
请记住,在lambda func
的主体中是一个左值(因为它有一个名称)。如果没有forward
函数参数,则永远无法调用&&
限定的重载。此外,如果没有&
限定的重载,那么即使调用者传递给您一个右值foo
实例,您的代码也将无法编译。
现场演示
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 为什么调用转发引用构造函数而不是复制构造函数?
- 将函数调用转发到成员变量
- C++11可变模板函数调用转发
- 转发构造函数调用基类的复制构造函数2次
- C++:转发模板成员函数调用失败
- C++将非模板成员函数调用转发到模板函数
- 将函数调用转发给成员是不好的做法吗?
- 何时应该转发函数调用