带有自动参数转发的 C++ decltype

C++ decltype with auto parameters to forward

只是 post 来这里看看是否有人可以提供一些有用的信息以进行更“外行”的解释。

我在 Whosebug 上看到了很多关于 decltype 和 auto 之间的区别。但是,我要么没有点击足够多的论坛 posts,要么根本不存在。这是上周的一道测试题,当时我一辈子都弄不明白,在 Google 和其他各种论坛上度过了一段美好的时光后,我现在对细节仍然非常模糊。

为什么要使用带有 auto&& 参数的 decltype 来 std::forward 它们?

pseudo/example 代码是什么样的?

如果你知道这里有类似的 post,我会很高兴地指出正确的方向:)

感谢您的帮助,谢谢!

给定 lambda 函数

auto f = [](auto&& arg) {
  // ...
};

这大致相当于模板函数:

template<class Arg>
auto f(Arg&& arg)
{
  // ...
}

请注意,在它们的模板函数中,我们有模板类型 Arg,我们可以使用它来转发参数 arg

所以我们可以写

do_something(std::forward<Arg>(arg));

恰好 decltype(arg)Arg

所以我们可以替代:

do_something(std::forward<decltype(arg)>(arg));

在 lambda 中我们没有模板类型 Arg,但是 decltype(arg) 是等价的。

同样,同样的表达方式符合我们的目的:

auto f = [](auto&& arg) {
  do_something(std::forward<decltype(arg)>(arg));
};

或者我们可以对 reader 友善一点:

auto f = [](auto&& arg) 
{
  using arg_type = decltype(arg);
  do_something(std::forward<arg_type>(arg));
};