完美的转发困境

时间:2014-11-09 02:20:02

标签: c++ c++11

说我有这个结构:

template <typename ...A>
struct A
{
  void f(A&& ...args)
  {
    fwd(std::forward<A>(args)...);
  }

  template <typename ...B>
  void g(B&& ...args)
  {
    fwd(std::forward<B>(args)...);
  }
};

如果fgA... == B...会完美转发吗? IMO,他们应该,但我只是要求确定。

编辑: 这个问题的原因是关于完美转发功能应该始终是模板功能的常见讲座。显然f不是这样。

2 个答案:

答案 0 :(得分:2)

  

如果fgA... == B...会完美转发吗?

是。我认为没有理由不应该这样做。

答案 1 :(得分:1)

是的,如果A... == B...,行为没有区别。但是,关于需要模板转发函数的常见建议的原因是您希望编译器推导出类型(如函数模板的情况),而不是必须指定正确的类型(如在案例中)一个类模板)。类型X的以下代码段(当然,它们不满足A... == B...)说明了这种差异:

X x;
A<X>::f(X());
A<X>::g(X());//here, f and g have the same behaviour

A<X>::f(x);//fails to compile, since A<X>::f expects an rvalue ref.
A<X>::g(x);//works as expected - Here, B... = X&, while A... = X.

A<const X&>::f(X());//oh noes! fwd gets a const X&.
A<const X&>::g(X());//forwards correctly as B... = X, even though A... = const X&.