【问题标题】:C++ Perfect forwarding vs const referenceC++ 完美转发与 const 引用
【发布时间】:2020-11-05 21:21:55
【问题描述】:

好吧,伙计们,我有一个简单的问题,我不明白

int solution(int&& a, int&& b);

int main() {
    int a, b;
    std::cin >> a >> b;
    std::cout << solution(std::forward<int>(a), std::forward<int>(b)) << std::endl;
}

int solution(int&& a, int&& b) {
    return a + b;
}

我是一名 Java 开发人员,从大学背景开始重新学习 C++,我总是在 any 类型后面看到“&&”,我了解到这是一个右值引用,然后我了解了 move构造函数等...我只是不清楚 std::forward 在场景之外做了什么?它真的给出了右值引用,所以没有创建参数的副本吗?如果这是正确的,为什么它比只写 const int& 更好?(我也不在这里复制任何东西...... 这个问题可能很愚蠢,但提前谢谢)

【问题讨论】:

  • 你读过en.cppreference.com/w/cpp/utility/forward吗? std::forward 仅与 forwarding references 一起使用 — 大致表示函数参数 T&amp;&amp; 其中 T 是函数模板的类型参数。
  • 完美转发是带模板函数和&amp;&amp;参数。在非模板函数&amp;&amp; 中,参数绑定到右值参数。 (曾经使用过通用参考这个词,但它通常已经失宠了。)
  • 谢谢你们,我想我需要更多关于完美转发的阅读......

标签: c++ reference rvalue perfect-forwarding


【解决方案1】:

它真的给出了右值引用,所以没有创建参数的副本吗?

是的。

如果这是正确的,为什么它比只写 const int& 更好?(我也没有在这里复制任何东西。

不是。

事实上,对于一个简单的int,您甚至不应该通过引用传递。它们足够小,因此更可取的是简单的传递副本(奇怪的是,可能更容易优化)。

右值引用对于实现移动语义(具有可以传输的间接资源的类)和完美转发很有用,而不是用于简单的非可变函数参数。

您的示例与完美转发无关;它只是传递对函数的引用。

我总是在任何类型之后看到“&&”

你不应该“总是”看到它。

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2020-10-23
    • 2011-04-05
    • 1970-01-01
    相关资源
    最近更新 更多