gpt4 book ai didi

c++ - 如何查找右值引用是否是显式应用 std::move 的结果?

转载 作者:太空狗 更新时间:2023-10-29 21:39:11 24 4
gpt4 key购买 nike

我正在尝试实现一个容器(出于某种原因)不允许实现简单的“引用类型”。它类似于 vector<bool> ,其中引用实际上是一个小对象,表示对容器特定元素的“引用”。

现在我想使用“修改”STL 算法,如 std::sort对于这个容器并使其尽可能高效。一旦该算法仅基于引用对象的交换和比较,一切都会运行良好,因为即使对于存储在容器中的重物,这两者也可以快速完成。

当算法试图复制一个临时值时就会出现问题,例如,在插入排序的某些实现中,在某些时候代码包含语句

value_type val = * iterator;

哪里* iterator (自定义 operator*() )按值 返回一个轻量级引用对象。我可以实现从引用 r 值到值类型的移动构造函数(以及赋值)并有效地实现它,但这会有效地“窃取”迭代器“指向”的值的内容根本不是上述声明的意图。如果有一种方法可以区分这种语句和

value_type val = std::move(* iterator)

在那里我可以毫无悔意地窃取“引用”的内容。

我考虑过向引用对象添加一个“标志”,以表示从给定的引用 r 值进行移动或复制是否安全,并允许在 std::move 时立即移动。被明确应用。我明白 std::move只是一个静态转换,以便实现“自定义”move在这里不是真正的选择(例如,具有自定义 swap )。

任何想法或指示都会有所帮助。

最佳答案

您可以为 wrapperType 添加重载 move

namespace std
{
SomeType move(my_namespace::wrapperType&) {/* Your implementation */}
}

每次调用 std::move 时注意包含它,否则,程序格式错误,无需诊断。

std::forward 可能有类似的处理方式。

注意:在std中声明/定义函数/类大部分时间是UB。

关于c++ - 如何查找右值引用是否是显式应用 std::move 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524025/

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