问题标签 [stdmove]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
817 浏览

c++ - 为什么我没有收到任何已知的转换错误?

我有这样的代码: Link to Wandbox

当我尝试编译它时,我得到了这个:

问题是我做错了什么?为什么编译器告诉我我正在尝试转换DiMarkDiMark&&DiMark&&自从我std::move(DiMark) {}明确地将左值转换为右值后,它应该不是已经存在了吗?

0 投票
2 回答
16169 浏览

c++ - 在哪里使用 std::move 字符串?

我正在读这篇文章

我达到了以下代码。

我想知道:

  • 对字符串有用吗std::move(假设字符串足够长)?

  • 它会使先前的字符串无效吗?

  • 我应该在哪里使用它,在哪里不应该使用它?

.


我的技术一直在使用

0 投票
1 回答
485 浏览

qt - 将右值引用传递给 QVariant 不适用于 QString

我正在尝试将函数的右值引用返回给 QVariant。它适用于 bool 和 int,但是当我传递一个字符串时,我得到一个“无效”的 QVariant。

我的功能:

当我打电话时:

有效的是:

有谁知道为什么?

0 投票
2 回答
926 浏览

c++ - C++ 中的 std::move() 和 xvalue

有人可以给我 xvalue 和 std::move() 行为的“非循环”定义/解释吗?

我查看了 cppreference 页面,它说“std::move() 产生一个 xvalue”。(好的)

然后我寻找“xvalue”的定义,它说的第一件事是它是一个函数调用或重载的运算符表达式,例如“std:move”。(???)

0 投票
1 回答
276 浏览

c++ - 为什么 C++ 编译器不在按值传递场景中优化更多的字符串构造?

(这个问题的灵感来自Nicolai Josuttis 的 CppCon 2017 演讲。)

考虑以下源文件(对于一个对象,而不是一个完整的程序):

以及它在 GodBolt 上的编译结果

即使使用-O2(甚至使用-O3),似乎字符串构造函数也被调用了三次。具体来说,s被构造,仅用于构造s_,然后被破坏。我的问题:

  • 是否允许编译器简单地s_从 ctor 的参数构造,而不是构造s
  • 如果不是,编译器是否允许从 移动构造s_s看看后者是如何被使用的?
  • 如果前面的任何一个答案是“是” - 为什么 gcc 和 clang 不这样做?
  • 如果s构造正确,编译器不能避免构造hello,看看它没有其他用途吗?或者至少摆脱它?
0 投票
1 回答
220 浏览

c++ - std::move 和 std::forward 之间的混淆

所以我只是写了一个示例和人为的例子以std::forward供我理解,但它并没有按我预期的方式工作。在下面的程序中

在输出中

funcC中,即使我使用了通用引用并且在这里它绑定到 Lvalue,但当我这样做时,字符串也会移动std::forward<std::string>。因此在最后一行,在“Main:”之后没有输出。即使 obj 绑定到 Lvalue,有人可以请教如何移动字符串。

重读一本书后,才意识到这个问题的答案。

在funcC中,std::forward<std::string>(obj.m_)相当于移动字符串。但是在 funcD 中,std::forward被实例化为std::forward<struct A&>(obj),被复制。

0 投票
1 回答
397 浏览

c++ - 为什么 std::move() 在 C++ 中工作?

以下是代码片段:

在 C++ 入门中,移动是

据我所知,这个std::move模板会扣除一个像

作为比较并详细说明我的问题,请考虑以下示例:

上面的代码将被编译为:

同样,我认为第一个代码片段将编译为:

这似乎是错误的,因为temp它是一个左值,我有什么问题吗?

0 投票
1 回答
102 浏览

c++11 - std::move、返回值优化和析构函数之间的交互

Stack Overflow 上有很多关于 std::move 和复制省略之间的交互的线程,例如
什么是复制省略和返回值优化?
如何对复制省略/返回值优化有信心
c++11 返回值优化或移动?

但是,所有这些线程似乎都没有回答这个问题,即是否可以依赖编译器进行必要的优化。

如果在最坏的情况下我们的性能略有下降,这不是问题,但如果由于可能重复的析构函数调用而与正确性冲突,则可能是致命的。

我有以下情况:

那里会发生什么?这能保证工作吗?或者是否存在代码无法编译的情况,或者更糟糕的是,析构函数在同一个对象上被调用两次?

据我了解,如果我声明了移动构造函数,编译器不会生成默认的复制构造函数。我必须指定一个复制构造函数吗?如果我这样做会怎样?或者我应该在 return 语句中使用 std::move 吗?

我将像这样调用上面的方法:

0 投票
2 回答
274 浏览

c++ - 是否有可能拥有带有移动操作的类型,这些类型会放入容器中?

在和同事解释对象的移动操作时,我基本上说移动操作不应该在容器中抛出异常,因为如果移动操作失败,那么就没有办法可靠地恢复原始对象。再想一想,我想知道这是否不正确,如果移动操作确实抛出,它可以将原始对象恢复到原始状态。

这样做的原因是,如果一个对象可以抛出,那么它不会因为将包含的对象从旧地址复制或移动到新地址而抛出,而是在资源获取失败时抛出。所以所有原始信息应该仍然存在。如果是这种情况,那么编译器是否应该无法逆转它为重构原始对象所做的操作?

一个操作可能是一种方式,比如移动一个整数,但在这种情况下它可能只是终止应用程序,也许如果开发人员想避免这种方式操作可以使用交换方法来代替。

这只能在默认的移动运算符上实现,就像有任何额外的逻辑一样,编译器可能很难进行反向部分转换。

我是否过于简单化了事情?有没有我错过的东西可以让容器在没有非抛出移动构造函数/操作符的情况下移动对象?

0 投票
1 回答
1561 浏览

c++ - 将参数传递给构造函数和成员函数时移动或复制

以下是我的典型代码示例。A 有很多看起来像这样的对象:

我的动机和对该主题的一般理解:

  • 在构造函数和方法中使用 const 引用,以避免在传递对象时重复复制。
  • 简单类型 - 按值传递;类和结构 - 通过 const 引用传递(或当我需要修改它们时的简单引用)
  • 强制编译器创建default移动构造函数和移动赋值,以便它能够做它的奇特魔法,同时它允许避免编写无聊ctor() : m_v1(std::move(v1)), m_v2(std::move(v2)), m_v3(std::move(v3)) {}的 .
  • 如果表现不佳,请使用 libc 和原始指针,然后将其包装在课堂上并写下注释。

我有一种强烈的感觉,根据经验法则是有缺陷的,而且根本不正确。

看完cppreference、Scott Mayers、C++标准、Stroustrup等,感觉是:“是的,这里的每一个字我都看懂了,但还是没有任何意义”。我唯一理解的就是move语义当我的类包含不可复制的类型(如std::mutex和)时才有意义std::unique_ptr

我见过很多代码,人们通过值传递复杂的对象,比如大字符串、向量和自定义类——我相信这就是移动语义发生的地方,但是,再次,你如何通过移动将对象传递给函数?如果我是正确的,它将使对象处于“某种空状态”,使其无法使用。

所以,问题是: - 我如何正确地决定传递值和传递引用?- 我是否需要同时提供复制和移动构造函数?- 我需要显式编写移动和复制构造函数吗?我可以用= default吗?我的类主要是 POD 对象,因此不涉及复杂的登录。- 调试时,我总是可以在自己的类的构造函数中编写std::cout << "move\n";或编写std::cout << "copy\n";,但是我怎么知道来自的类会发生什么stdlib

PS它可能看起来像是绝望的呐喊(确实如此),而不是一个有效的SO问题。我根本不知道如何比这更好地表述我的问题。