问题标签 [move-constructor]
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++11 - “没有已知的转换”错误,即使转换运算符被写入
我相信以下应该有效:
X 只有一个单参数构造函数。它需要一个X&&
. Converts 对象是临时的,它转换为X&&
. 那么为什么我会从 clang-3.3 收到此错误消息:
我能够明确地将运算符称为:
对我来说不幸的是,它适用于ideone,据我所知,它基于 g++ 。目前是否有任何在线clang编译器正在运行?
c++ - C++11 移动构造函数比 C++98 复制构造函数慢
让我们看一下以下三个类:
我还有一个功能来衡量他们每个人的表现:
我不太明白的是为我的类的每个实例运行此性能测试的结果。我怀疑 IntTab1 应该是最快的,因为它使用移动构造函数和移动赋值运算符,没有例外。事实上,在我的环境中结果是相反的——最快的是 C++98 版本,只使用了复制构造函数和赋值运算符。这是我的结果:
IntTab 的经过时间:2.2873e-05s
IntTab1 的经过时间:2.4139e-05s
IntTab2 的经过时间:2.3554e-05s
有人可以解释这种奇怪的行为吗?
编辑
根据关于错误复制构造函数(不做真正的深拷贝)的评论 - 我有一个测试功能,我假设它测试这种行为:
如果我的复制构造函数不能正常工作,为什么这个函数能正常运行?
c++ - Move constructor with memcpy
I have a struct that i want to be non copyable, only movable, but as it contains a lot of POD, writing move constructor would be long and forgetting a variable would be hard to debug. Example:
What would be the problems with this kind of move constructor:
What problems could I face and is this well defined?
c++ - C++ 移动语义:为什么调用复制赋值运算符=(&) 而不是移动赋值运算符=(&&)?
我有以下代码:
我希望移动构造函数调用移动赋值运算符。这是该程序的输出:
如您所见,移动赋值运算符已成功调用,但在分配给*this
内部移动构造函数时未成功调用。为什么会发生这种情况,我可以以某种方式解决它吗?
c++ - 使用“new ClassType(std::move(/*class_object*/))”在 freestore 中构造对象
初学者的问题:
由new分配的对象在 free-store 中。*这是调用clone()的任何对象,不一定是动态分配的对象。
如果移动对象和移动对象位于不同的内存区域,移动机制如何工作?或者也许他们从来没有真正在不同的领域,我错过了什么?
据我了解,移动构造函数创建了新的开销,这些开销链接到被移动对象的数据/内存部分。数据本身不会移动/更改。在上述情况下这是如何工作的?如果它以相同的方式工作,那么在新运行之后,我们不会有一个动态分配的对象位于自由存储之外(无论*它位于何处?)这是否由std::move()以某种方式解决?我不完全确定std::move()如何/为什么工作,除了它强制返回对命名对象的右值引用,从而可以从该对象移动。
c++ - 编译器在移动和复制构造函数之间的选择
最小的例子:
编译:
输入:
输出:
这是 A 行或 C 行的输入/输出。如果我使用 B 行,我会std::move
因为一些奇怪的原因而得到。在所有版本中,输出不依赖于我的输入(i 的值除外)。
我的问题:
- 为什么版本 B 和 C 不同?
- 为什么编译器会在案例 A 和 C 中进行复制?
c++ - 在 C++11 中移出 std priority_queue 的元素
最小的工作示例。
所以这行得通。现在从第 4 行删除注释符号,它说需要复制构造函数(我的被删除了)。此外,它错过了operator=
. 问题:
- 这里有什么区别?
- 问题可以解决吗?如果是,如何,如果不是,为什么不呢?
注意:您也可以使用 boost 的 priority_queue 作为答案,但我也遇到了同样的错误。
c++ - 如果在没有移动构造函数的情况下移动对象会发生什么?
如果std::move()
在没有定义移动构造函数的用户定义对象上调用会发生什么?是简单的复制吗?
c++ - 为什么调用复制构造函数而不是移动构造函数?
考虑以下代码:
当我尝试在 Visual Studio 2012 上编译上述代码时,出现以下错误:
Error 1 error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
显然,编译器在方法中找到的 push_back 中调用了复制构造函数而不是移动构造函数addOuter
。这是编译器错误吗?如果不是,为什么对于这种特定情况,不调用移动构造函数?
c++ - 为什么不调用移动构造函数?
我正在做C++ Primer 5th Edition的练习,就像:
练习 13.50:将 print 语句放入 String类的移动操作中,然后重新运行第 13.6.1 节(第 534 页)中练习 13.48 中的程序,该程序使用向量查看何时避免复制。(第 544 页)
这String
是一个练习类,其行为类似于std::string
不使用任何模板。String.h
文件:
默认、复制和移动构造函数的实现String.cpp
:
Main.cpp
:
输出:
可以看出,根本没有调用移动构造函数。为什么向量分配更多内存时不调用移动构造函数?
更新:
编译器信息:
main.cpp
具有打印能力及其输出:
输出: