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

时间:2017-12-10 21:03:20

标签: c++ auto decltype perfect-forwarding

只是在这里发帖,看看是否有人可以在更多的“非专业人士”解释中提供一些有用的信息。

关于decltype和auto之间的差异,我在stackoverflow上看到了很多。但是,我要么没有点击足够的论坛帖子,要么根本就没有。这是上周的一个测试问题,我当时的生活中无法弄清楚,在与Google及其他各种论坛共度美好时光之后,我现在对细节仍然非常模糊。

为什么人们应该使用decltype和auto&&参数到std ::转发它们?

伪/示例代码对此是什么样的?

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

感谢您的帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

给出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));
};

或者我们可以对读者有点友善:

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