5

如果我们有以下情况:

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

4

3 回答 3

8

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

于 2011-06-09T02:05:10.987 回答
3
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<A&&>而不是B<A>

于 2011-06-09T01:58:44.843 回答
2
auto y1 = f(A());
auto y4 = f(std::move(x));

将无法区分,因为A()会产生一个将绑定到A&&.

于 2011-06-09T02:07:36.973 回答