【发布时间】:2022-01-09 18:18:45
【问题描述】:
#include <utility>
void f(auto const& fn1)
{
{
auto fn2 = std::forward<decltype(fn1)>(fn1);
auto fn3 = std::forward<decltype(fn2)>(fn2); // ok
fn3();
}
[fn2 = std::forward<decltype(fn1)>(fn1)]
{
auto const fn3 = fn2;
auto fn4 = std::forward<decltype(fn3)>(fn3); // ok
fn4();
auto fn5 = std::forward<decltype(fn2)>(fn2); // error
fn5();
}();
}
int main()
{
f([] {});
}
为什么 std::forward 在 lambda 主体中不起作用?
更新信息:
g++ 可以,但是 clang++ 拒绝它。谁是正确的?
【问题讨论】:
-
为什么你不把它写成一个没有 auto 参数的“普通”模板。在你的情况下,所有 decltype 的东西都让我作为一个读者很困惑。拥有简单的
typename T会更容易理解。而且我也很难理解为什么使用 const& 因为它不是转发引用而是使用 std::forward。 -
这是一个最小化的POC。
标签: c++ lambda c++20 mutable perfect-forwarding