【问题标题】:Perfect forwarding完美转发
【发布时间】:2011-06-09 01:47:27
【问题描述】:

如果我们有以下情况:

template <class T>
struct B{
  T data;
}

struct A{
  int data_array[100];
}

int main()
{
  A x;
  const A x_const;

  auto y1 = f(A());
  auto y2 = f(x);
  auto y3 = f(x_const);
  auto y4 = f(std::move(x));
}

我想知道一个f(最好是函数,但宏也可以)这样:

decltype(y1) == B<A>
decltype(y2) == B<A&>
decltype(y3) == B<const A&>
decltype(y4) == B<A&&>

f完美地将x转发到B的对象中。

【问题讨论】:

  • 你可以选择函数重载作为最后的手段。 :)

标签: c++ c++11 forwarding decltype


【解决方案1】:

这是不可能的。对于y1y4,它们都采用A 类型的右值,但您希望它们返回不同的类型。 f应该怎么知道返回什么?

【讨论】:

  • 嗯,decltype(A())Adecltype(std::move(A()))A&amp;&amp;,所以有一些区别。
  • @HighCommander4:它们都是右值。没有参考或其他语言结构可以区分 A 和未命名的 A&&- 事实上,这是你不能区分的一半。
  • @HighCommander4 有问题的区别在于一个是prvalue,另一个是xvalue。由于参数传递只允许区分左值和右值,因此确实不可能检测到函数内部的差异(这是设计使然)。
【解决方案2】:
template <typename T>
auto f(T&& t) -> B<decltype(std::forward<T>(t))>
{
    return B<decltype(std::forward<T>(t))>{std::forward<T>(t)};
}

几乎做到了你想要的。唯一的区别是第一个类型是B&lt;A&amp;&amp;&gt; 而不是B&lt;A&gt;

【讨论】:

    【解决方案3】:
    auto y1 = f(A());
    auto y4 = f(std::move(x));
    

    无法区分,因为A() 会生成一个临时绑定到A&amp;&amp;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2020-09-12
      • 2017-08-05
      • 2015-04-11
      • 2017-07-17
      • 2022-01-22
      相关资源
      最近更新 更多