【发布时间】:2015-09-24 01:00:11
【问题描述】:
我在 Effective Modern C++ 中看到的代码 sn-p 巧妙地实现了 instrumentation rationale 以创建 函数计时器:
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)(...
- 据我了解,我们实际上是将函数强制转换为其原始类型,但是为什么需要这样做?看起来很简单打电话就可以了。
- 还有其他情况我们使用完美转发来进行函数调用吗?
这看起来像是 the use of familiar template syntax in lambda expressions 的一个很好的用例,以防我们想让计时器类型成为编译时间常数。
【问题讨论】:
-
我认为这可能是因为
func可以使用非常量运算符()来实现大函数对象。这样,您可以避免无意义的复制,并允许函数对象的突变 -
表达式的 type 不会随强制转换而改变,但它的 value category 会。这就是全部而且只有point of
forward。 -
目的是确保选择正确的ref-qualified 重载
operator()。 -
func 的类型,一旦在函数中,就不再是 r 值引用了(假设它是在传入时)。如果是这样,每次你将它传递给一个函数时,它都会尝试移动它!这就是需要
std::forward的原因。 -
@Cameron 这里没有任何东西被传递给另一个函数。我的问题是针对这种特定情况的。 Tavian Barnes 指出的原因(并由 Kerrek 暗示)似乎令人信服
标签: c++ lambda c++14 perfect-forwarding forwarding-reference