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完全に転送されます。xB

4

3 に答える 3

8

不可能だよ。y1との場合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 に答える