问题标签 [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.
c++ - 为什么我没有收到任何已知的转换错误?
我有这样的代码: Link to Wandbox
当我尝试编译它时,我得到了这个:
问题是我做错了什么?为什么编译器告诉我我正在尝试转换DiMark
为DiMark&&
?DiMark&&
自从我std::move(DiMark) {}
明确地将左值转换为右值后,它应该不是已经存在了吗?
c++ - 在哪里使用 std::move 字符串?
我正在读这篇文章。
我达到了以下代码。
我想知道:
对字符串有用吗
std::move
(假设字符串足够长)?它会使先前的字符串无效吗?
我应该在哪里使用它,在哪里不应该使用它?
.
我的技术一直在使用
qt - 将右值引用传递给 QVariant 不适用于 QString
我正在尝试将函数的右值引用返回给 QVariant。它适用于 bool 和 int,但是当我传递一个字符串时,我得到一个“无效”的 QVariant。
我的功能:
当我打电话时:
有效的是:
有谁知道为什么?
c++ - C++ 中的 std::move() 和 xvalue
有人可以给我 xvalue 和 std::move() 行为的“非循环”定义/解释吗?
我查看了 cppreference 页面,它说“std::move() 产生一个 xvalue”。(好的)
然后我寻找“xvalue”的定义,它说的第一件事是它是一个函数调用或重载的运算符表达式,例如“std:move”。(???)
c++ - 为什么 C++ 编译器不在按值传递场景中优化更多的字符串构造?
(这个问题的灵感来自Nicolai Josuttis 的 CppCon 2017 演讲。)
考虑以下源文件(对于一个对象,而不是一个完整的程序):
以及它在 GodBolt 上的编译结果。
即使使用-O2
(甚至使用-O3
),似乎字符串构造函数也被调用了三次。具体来说,s
被构造,仅用于构造s_
,然后被破坏。我的问题:
- 是否允许编译器简单地
s_
从 ctor 的参数构造,而不是构造s
? - 如果不是,编译器是否允许从 移动构造
s_
,s
看看后者是如何被使用的? - 如果前面的任何一个答案是“是” - 为什么 gcc 和 clang 不这样做?
- 如果
s
构造正确,编译器不能避免构造hello
,看看它没有其他用途吗?或者至少摆脱它?
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)
,被复制。
c++ - 为什么 std::move() 在 C++ 中工作?
以下是代码片段:
在 C++ 入门中,移动是
据我所知,这个std::move
模板会扣除一个像
作为比较并详细说明我的问题,请考虑以下示例:
上面的代码将被编译为:
同样,我认为第一个代码片段将编译为:
这似乎是错误的,因为temp
它是一个左值,我有什么问题吗?
c++11 - std::move、返回值优化和析构函数之间的交互
Stack Overflow 上有很多关于 std::move 和复制省略之间的交互的线程,例如
什么是复制省略和返回值优化?
如何对复制省略/返回值优化有信心
c++11 返回值优化或移动?
但是,所有这些线程似乎都没有回答这个问题,即是否可以依赖编译器进行必要的优化。
如果在最坏的情况下我们的性能略有下降,这不是问题,但如果由于可能重复的析构函数调用而与正确性冲突,则可能是致命的。
我有以下情况:
那里会发生什么?这能保证工作吗?或者是否存在代码无法编译的情况,或者更糟糕的是,析构函数在同一个对象上被调用两次?
据我了解,如果我声明了移动构造函数,编译器不会生成默认的复制构造函数。我必须指定一个复制构造函数吗?如果我这样做会怎样?或者我应该在 return 语句中使用 std::move 吗?
我将像这样调用上面的方法:
c++ - 是否有可能拥有带有移动操作的类型,这些类型会放入容器中?
在和同事解释对象的移动操作时,我基本上说移动操作不应该在容器中抛出异常,因为如果移动操作失败,那么就没有办法可靠地恢复原始对象。再想一想,我想知道这是否不正确,如果移动操作确实抛出,它可以将原始对象恢复到原始状态。
这样做的原因是,如果一个对象可以抛出,那么它不会因为将包含的对象从旧地址复制或移动到新地址而抛出,而是在资源获取失败时抛出。所以所有原始信息应该仍然存在。如果是这种情况,那么编译器是否应该无法逆转它为重构原始对象所做的操作?
一个操作可能是一种方式,比如移动一个整数,但在这种情况下它可能只是终止应用程序,也许如果开发人员想避免这种方式操作可以使用交换方法来代替。
这只能在默认的移动运算符上实现,就像有任何额外的逻辑一样,编译器可能很难进行反向部分转换。
我是否过于简单化了事情?有没有我错过的东西可以让容器在没有非抛出移动构造函数/操作符的情况下移动对象?
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问题。我根本不知道如何比这更好地表述我的问题。