move-semantics 相关问题

移动语义是一种编程语言功能,当源对象是临时对象或其他过期对象时,允许复制操作被更有效的“移动”替换。

为 MyString 实现按位交换

以下 Move 操作是否合法,因为没有 UB。 我想实现 16 字节 MyString 的一次交换,而不是两次交换。 类 MyString { std::size_t size_; 字符* str_...

回答 1 投票 0

Rust 有一天能在对象移动过程中优化掉按位复制吗?

考虑片段 结构体 Foo { 虚拟:[u8; 65536], } fn 酒吧(foo: Foo) { println!("{:p}", &foo) } fn 主() { 让 o = Foo { 虚拟:[42u8; 65536]}; println!("{:p}", &o)...

回答 2 投票 0

当捕获的对象在复制构造函数中抛出时警告“bugprone-exception-escape”

当我有一个按值捕获对象的 C++ lambda,并且该对象可以在其复制构造函数中抛出异常时,clang-tidy 将显示警告: 警告:fu 中可能会抛出异常...

回答 1 投票 0

我应该从`std::future`中`std::move`吗?

假设我有一个返回 std::vector 的函数,我想异步调用它。 std::vector foo(int n); int main() { 自动 future_vector = std::async(foo, 999); // ...

回答 1 投票 0

移动指针有什么好处吗?

我现在正在使用代码库,此部分包含以下内容: if(const auto *temp_ptr = obj->get_ptr()) { perm_ptr = std::move(temp_ptr); } 这有什么意义...

回答 2 投票 0

如何在循环中使用移动语义并避免复制?

我想练习线程,因此我创建了一个小解析器。我希望使线程版本尽可能快,因此我想避免使用移动语义进行复制。但我...

回答 1 投票 0

Python“移动语义”

我有一个主线程需要定期将缓冲区刷新到磁盘,所以每次我创建一个新线程来运行 json.dump(buffer) 。但在此之后我需要立即清除缓冲区,所以...

回答 1 投票 0

使用 std::move() 从 null 时无效的类中提取 std::unique_ptr 成员:如何避免无形中使对象无效?

考虑以下场景: 结构体 foo {}; 班级酒吧 { 民众: 酒吧(std :: unique_ptr数据):数据{std :: move(数据)} {} foo* get_data() { return (this->data).get(); } } 优先...

回答 1 投票 0

为 const 引用和右值引用编写重载

最近我发现自己经常遇到这样的情况:只有一个函数接受某个对象作为参数。该函数必须复制该对象。 然而该函数的参数...

回答 3 投票 0

调整大小时 std::vector 会复制/移动元素吗?

我正在与移动c'tors进行学习/刷新练习,我遇到了一些意想不到的事情。下面我有一个包含 std::string m_name; 的类 person。我正在使用这个...

回答 1 投票 0

C++11:移动操作会更改地址吗?

假设我有一个主类 SomeManager 来跟踪另一个类 SomeClass 的实例。当 SomeClass 被构造时,它调用 SomeManager 的方法,传递一个指向自身的指针......

回答 3 投票 0

这种理解正确吗:如果一个对象本身存储了所有内容,那么复制它和移动它实际上是同一件事?

C++ 中“本身存储或不存储所有内容的对象”示例: 使用 EverythingInMyself1 = int[64]; 使用 EverythingInMyself2 = 结构 { 布尔标志; 整数头; uint8_t da...

回答 1 投票 0

移动赋值参数在取消引用时会抛出错误,但在直接访问成员时有效

在最少需要的代码片段中,在移动赋值中,为什么注释行 *arg = nullptr;非法且 arg.p = nullptr;好的?如果我理解正确的话,两者都在修改右值,但在

回答 1 投票 0

C++ 移动赋值参数在取消引用时会引发错误,但在直接访问成员时有效

在最少需要的C++代码片段中,在移动赋值中,为什么注释行 *arg = nullptr;非法且 arg.p = nullptr;好的?如果我理解正确的话,两者都在修改右值,是的...

回答 1 投票 0

在 C++ 中,当仅移动类型的右值按值传递给函数时,幕后会发生什么?

我试图更好地理解 C++ 中的值类别,但我遇到了一些让我有点困惑的代码。 我查看了一些问题,例如按值或 rva 接受仅移动参数...

回答 1 投票 0

使用不同的比较函子将对象从一个集合移动到另一个集合

我的程序中有大量大型对象。它们当前存储在带有客户比较函子的 std::set 中。该集合一开始是空的,我不断地将物体放入其中。我也

回答 1 投票 0

将 unique_ptr 推入变体 unique_ptr 的向量中

我正在玩c++并遇到这个问题 如果我有一个看起来像这样的变体: 使用水果=变体 和一个变量的 unique_ptr 向量: 矢量 我正在玩 C++ 并遇到这个问题 如果我有一个如下所示的变体: using Fruit = variant<Apple, Tomato> 以及变体的 unique_ptr 向量: vector<unique_ptr<Fruit>> fruits 如何将 unique_ptr<Apple> 移动到 fruits 向量中? 这是一段示例代码: #include <variant> #include <memory> using namespace std; struct Apple {}; struct Tomato {}; using Fruit = variant<Apple, Tomato>; int main() { vector<unique_ptr<Fruit>> fruits; unique_ptr<Apple> apple = make_unique<Apple>(); fruits.push_back(unique_ptr<Fruit>(move(apple))); // error here } 在致电 push_back 时,我收到此错误: No matching conversion for functional-style cast from 'remove_reference_t<unique_ptr<Apple, default_delete<Apple>> &>' (aka 'std::unique_ptr<Apple>') to 'unique_ptr<Fruit>' (aka 'unique_ptr<variant<Apple, Tomato>>') 如果我将行更改为fruits.push_back(unique_ptr<Apple>(move(apple)));,我会收到此错误: No matching member function for call to 'push_back' 如果我将其更改为fruits.emplace_back(unique_ptr<Apple>(move(apple)));,则不会发生错误。 那么使用 emplace_back 是正确的选择吗?为什么会出现这个错误?我假设这是因为我无法将 unique_ptr<VariantMemberType> 投射到 unique_ptr<VariantType>? Fruit 与 Apple 无关。 Fruit 可能包含 Apple。无法将指向 Apple 的指针转换为指向 Fruit 的指针,就像无法将指向 int 的指针转换为指向 std::set<int> 的指针一样。最好的方法是创建一个新的 Fruit 对象,并将 apple 指向的值移动到新的 Fruit 中。 #include <memory> #include <variant> #include <vector> struct Apple {}; struct Tomato {}; using Fruit = std::variant<Apple, Tomato>; int main() { std::vector<std::unique_ptr<Fruit>> fruits; std::unique_ptr<Apple> apple = std::make_unique<Apple>(); fruits.push_back(std::make_unique<Fruit>(std::move(*apple))); } 请注意,我们现在用 Fruit 创建一个新的 std::make_unique 并移动 apple 指向的对象的值,而不是移动指针。值得注意的是,您现在将有一个由 Apple 指向的移自 apple。您需要其生命周期结束,您需要手动重置指针。

回答 1 投票 0

在函数调用后使用

使用 std::moved 强制转换的对象到底何时被移动? 例如,下面的代码是否构成移动后使用? f(std::move(a), a.Something()) 其中 f = f(A a, int x) 并且 a 是一个实例...

回答 2 投票 0

创建 std::vector 时“结果类型必须可从输入范围的值类型构造”

我有一个班员看起来像这样 类控制器{ 受保护: // 其他的东西 std::vector> 任务处理程序; //更多的东西 } 任务

回答 3 投票 0

为什么将变量移动到生成的线程中即使没有复制也会通过借用检查器?这不是意味着它使用指向原始的指针吗?

我有这段代码,但我不明白为什么它会编译: 使用 std:: 线程; 使用 std::time::Duration; 结构体状态{ 值:u32, } 隐含状态{ pub fn new() -> 状态{ 状态{值:...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.