完美转发

发布于 2024-11-14 11:03:57 字数 554 浏览 4 评论 0原文

如果我们有以下内容:

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< /code> 转换为 B 的对象。

If we have the following:

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

I want to know an f (preferably function, but macro is okay also) such that:

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

That is, f perfectly forwards x into an object of B.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

对你的占有欲 2024-11-21 11:03:57

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

This is impossible. For y1 and y4, then they both take rvalues of type A, but you want them to return different types. How should f know what to return?

清引 2024-11-21 11:03:57
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 而不是 B

template <typename T>
auto f(T&& t) -> B<decltype(std::forward<T>(t))>
{
    return B<decltype(std::forward<T>(t))>{std::forward<T>(t)};
}

This does almost what you want. The only difference is for the first one the type is B<A&&> rather than B<A>.

长发绾君心 2024-11-21 11:03:57
auto y1 = f(A());
auto y4 = f(std::move(x));

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

auto y1 = f(A());
auto y4 = f(std::move(x));

Will not be distinguishable, as A() produce a temporary which will bind to A&&.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文