gpt4 book ai didi

c++ - 无效使用旧代码 : how should I update it to modern, 中的右值引用正确用法?

转载 作者:太空宇宙 更新时间:2023-11-04 14:03:20 24 4
gpt4 key购买 nike

我正在将一个大型项目从 C++ Builder 2010 移植到 XE4,并且刚刚遇到这段代码。它编译、运行并且显然在 CB2010 中工作,并且根据修订日志是在我们仍在使用 C++ Builder 2007 时添加的。Neither of these compilers supported rvalue references.

VOperandValue& VOperandValue::operator=(VOperandValue&& oOther) {
// Assignment operator takes full control of all pointers etc, and sets oOther
// to not own anything
if (static_cast<void*>(this) != static_cast<void*>(&oOther)) {
CopyAndTakeOwnershipFrom(oOther);
}
return *this;
}

void VOperandValue::CopyAndTakeOwnershipFrom(VOperandValue&& oOther) {
// Lots of assignments to self's members, and clearing fields of oOther
}

需要注意两点:

  • operator=更改复制自对象是故意的。此类包装一次只能由一个对象拥有的资源。这超出了这个问题的范围,但行为虽然奇怪,但却是设计好的。还有一个复制构造函数和其他一些类似更改的方法。这些方法旨在用于复制自对象即将变为无效(例如,销毁)或将被重新用于保存新内容的情况。我不知道为什么 static_cast<void*>对于比较指向同一类型对象的指针是必需的;对我来说,这似乎是一件很奇怪的事情。
  • 代码已从使用标准引用(即 VOperandValue& oOther)更改为右值引用。尽管仅在 C++Builder XE(C++Builder 2010 之后的版本)中添加了对右值引用的支持,但编译器很高兴地接受并编译了它,并且代码在运行时似乎可以正常工作。

现在这段代码被加载到 XE4 中,在 CopyAndTakeOwnershipFrom(oOther) 行编译失败出现以下错误:

[bcc32 Error] OperandValue.cpp(178): E2559 Can't initialize rvalue reference of type 'VOperandValue' with lvalue of type 'VOperandValue'

[bcc32 Error] OperandValue.cpp(178): E2342 Type mismatch in parameter 'oOther' (wanted 'VOperandValue &&', got 'VOperandValue')

(我不明白这些错误,因为第 178 行是 CopyAndTakeOwnershipFrom(oOther); 行,并且 oOther 似乎肯定已在方法参数列表中定义为右值引用。那为什么它有问题传递相同变量时的左值非 r-ref?)

我有两个问题,一个主要的实际问题和一个次要的好奇心问题:

  1. 主要:将此代码从使用标准引用更改为右值引用的编码人员可能认为 move semantics在这种情况下是最好的。我可以理解,尽管赋值只涉及复制指针值,但工作量不大。 如果它们合适,我将如何正确对此代码使用右值引用?

  2. 二级:(仅供好奇。)2007 年和 2010 年的编译器是如何处理这段代码的?它是作为对引用文献的引用阅读的吗?两个做了吗&运营商合并并成为单一引用?既然它可能是无效的语法,但它编译并运行良好,它到底在做什么?

最佳答案

作为您的问题的解决方案,您可以使用 std::forward。

只需将您的代码更改为:

#include <utility>   
CopyAndTakeOwnershipFrom(std::forward<VOperandValue>(oOther));

出现问题是因为您想通过 2 个函数转发移动语义,但在第一个函数中,移动的对象获得了一个名称。有了名称,它不再是没有 std::forward 的右值,而是不能用于 CopyAndTakeOwnershipFrom 中的 T&& 参数的左值。它之前在 C++ Builder 2010 中工作似乎是一个错误,已在 XE4 中修复。

关于c++ - 无效使用旧代码 : how should I update it to modern, 中的右值引用正确用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18185530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com