【问题标题】:C++ decltype with auto parameters to forward带有自动参数的 C++ decltype 转发
【发布时间】:2017-12-10 21:03:20
【问题描述】:

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

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

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

这个伪/示例代码是什么样的?

如果你知道这里有类似的帖子,我很乐意指出正确的方向:)

感谢您的帮助,谢谢!

【问题讨论】:

  • "为什么要使用带有 auto&& 参数的 decltype 来 std::forward 它们?"因为没有可以使用的T

标签: c++ auto decltype perfect-forwarding


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多