C++ 我是唯一一个觉得std::move有点太难理解的人吗?

C++ 我是唯一一个觉得std::move有点太难理解的人吗?,c++,c++11,move-semantics,C++,C++11,Move Semantics,因此,我一直在某地和其他地方阅读有关std::move、std::forward、右值、左值广告等内容。但是我发现我不能理解它。尽管有时我会遇到一些问题,但我想我理解了C++之前的指针、引用等基本内容。是我还是这些东西太重了?如果您还没有阅读原始提案,我建议您阅读: 它非常清楚地列出了使用右值引用和移动语义可以解决的问题,以及如何使用右值引用和移动语义来解决这些问题 标准委员会的文件通常很密集,很难理解,但这篇文章很容易理解,非常值得一读。最终的C++0x标准(无论何时)中指定的右值引用和移动

因此,我一直在某地和其他地方阅读有关
std::move
std::forward
、右值、左值广告等内容。但是我发现我不能理解它。尽管有时我会遇到一些问题,但我想我理解了C++之前的指针、引用等基本内容。是我还是这些东西太重了?

如果您还没有阅读原始提案,我建议您阅读:

它非常清楚地列出了使用右值引用和移动语义可以解决的问题,以及如何使用右值引用和移动语义来解决这些问题


标准委员会的文件通常很密集,很难理解,但这篇文章很容易理解,非常值得一读。最终的C++0x标准(无论何时)中指定的右值引用和移动语义可能与本文中提出的不同,但概念仍然相同。

您的问题非常笼统。也许我可以让你开始:

  • 忽略开头的函数
    std:move()
    std::forward()
  • 右值引用的一个方面是保存临时值。
    • 在C++03代码中,计算
      矩阵z=a+b+C+d的临时值(使用
      矩阵a、b、c、d;
    • 使用重载的右值引用在矩阵上实现自己的
      操作符+
    • 你应该能够大大减少临时工的数量
如果您想看到std::move()的简单用法,请帮助编译器避免为返回值引入副本:

  • 制作一个像
    Image
    这样的容器类——复制成本很高
  • 不要忘记执行移动和复制分配
  • 发明一个工厂函数,其工作原理如下:

    Image load_matching_size(const char *fn_small, const char *fn_big) { pair<Image> ii = load_2_images(fn_small, fn_big); return ii.first.width() >= 64 ? ii.first : ii.second; } 图像加载匹配大小(常量字符*fn\u小,常量字符*fn\u大){ 第二对=加载2个图像(小fn,大fn); 返回ii.first.width()>=64?ii.first:ii.second; }
  • 你能数一数临时工的人数吗?请注意,
    返回值
    将需要一个附加值并复制!(该示例的设计应使返回值优化(“RVO”)不可能实现)

  • 你能看出这是不必要的吗?函数返回后,
    ii
    中的图像将很快被丢弃。编译器是否可以使用then作为返回值?(不,不可能。如果我们只有一张
    图像
    ),RVO就可以工作了)
  • 使用
    return
    中的
    move
    ,您可以告诉编译器,您不再需要
    ii
    ,它可以使用它进行返回。这样就可以使用move-c'tor而不是copy-c'tor为返回节省一份昂贵的my副本

幸运的是,在它们标准化之前,您还有大约10年的时间来尝试理解它们。您不能准确掌握什么?诚然,rvalues一开始可能有点混乱,但其他的都很简单。当然,如果愿意,您可以直接使用指针和引用,但它们可能被滥用和误用,导致有时难以诊断的问题。标准库旨在通过允许更多编译时验证来帮助您编写更安全、正确的代码,否则您可能无法进行这些验证。@Travis:不太可能。C++ 0x应该在明年被标准化,一些编译器实现已经支持它们(即Visual C++和G++,尽管其他人也已经支持它们)。杰姆斯:你的乐观情绪是如此的温暖。不过,更严重的是,如果您处于只需使用现代编译器的绝妙位置,请立即学习这些东西!不,我还没有读过,原因和你说的完全一样。我发现官方文件很难筛选。这就是为什么像这样的网站是如此伟大。但我会尝试一下:(@nakiya:请随时发帖,提出任何问题(如果你觉得那篇文章没有帮助,也可以在评论中诅咒我)。这篇文章是技术性的,但是从一个足够高的层次来看,它是可读的。