问题标签 [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++ - 移动构造函数签名
从这个参考,它允许const
右值作为移动构造函数
可移动物体怎么可能const
?即使这在技术上是允许的,是否存在这样的声明有用的情况?
c++ - std::vector::push_back 有前置条件吗?
在Andrzej 的移动构造函数文章的评论中,我发布了一个被移动的对象可以调用任何没有前置条件的成员函数。我把这个例子std::vector::front
作为一个函数给出,你不能在 move-from 上调用它,std::vector
因为它具有向量不为空的先决条件。我给出了std::vector::empty
,std::vector::push_back
和std::vector::reserve
as 的示例,您可以(但不应该)在 move-from 上调用std::vector
它们,因为它们没有先决条件。
然而,这让我开始思考。std::vector::push_back
要求主机系统上有足够的连续内存可用。这与其说是对std::vector
对象的要求,不如说是关于它正在运行的系统,但在我看来,这仍然是一个先决条件。
移动构造函数使对象处于有效但未指定状态的上下文是什么,它是否适用于潜在的内存不足情况std::vector::push_back
?特别是,如果std::vector::push_back
在移动之前可以工作,它是否保证在之后工作(忽略其他进程耗尽内存等问题)?
供参考:§ 17.6.3.1
c++ - unique_ptr,移动构造函数,以及为什么总是尝试访问私有成员
我经常遇到这个问题,我相信移动构造函数是有序的,但我认为复制构造函数是问题,隐藏它似乎不起作用。
编码:
发生错误的特定行是:
我试图移动而不是复制复制构造函数中的链接无济于事。如果移动构造函数是设计而不是合成的,那会更好吗?
c++11 - 无法让移动构造函数运行
C++11
我在使用移动构造函数时遇到问题。我有一个简单的容器类,叫做Number
,它唯一的数据成员是一个整数。我有以下代码:
和
和
这输出:
请注意,D 部分没有输出。A 和 B 部分的输出是我所期望的,但其他部分的输出不是。
我预计 C 和 D 部分会这样:
对 C 部分的期望:
我希望通过使用. Number{n1}
_ 然后我期望通过使用临时对象调用移动构造函数来构造。Number n3{Number{n1}}
Number
Number
n1
Number n3
对 D 部分的期望:
由于这类似于 C 部分,除了使用括号而不是花括号外,我希望这部分的行为和输出方式与我期望 C 部分相同。
问题:
为什么实际输出与我的预期不同,获得所需输出的正确方法是什么?
注意:如果您想在 Visual Studio 中编译它,您需要Visual C++ Compiler November 2012 CTP或更高版本的 Visual Studio 2012 以支持统一初始化语法。
c++ - 移动构造函数和继承
我试图了解移动构造函数和赋值操作在 C++11 中的工作方式,但我在委派给父类时遇到问题。
编码:
但是,当我在VS2012下编译运行时,输出显示T0成员的左值版本被调用:
移动赋值也会发生类似的情况(测试用例略有不同)——T 的移动赋值运算符称为 T0 的“正常”赋值运算符。
我究竟做错了什么?
c++ - 关于移动构造函数
我有三个问题:
A::str 的内存分配在函数 f 的范围内。将其移动到全局变量 vec 中的元素后,超出 f 范围的内存块是否仍然安全?
对于 struct B,没有明确给出移动构造函数,是否有像 struct A 这样的默认构造函数?
3.我可以确认这种危险情况在STL容器中从未发生过吗?
c++ - 由于移动构造函数而删除的对象
我正在尝试创建一个在从串行端口读取的专用线程中运行的函数。但是我无法将连接传递给线程。我将代码简化为以下示例:
但是,我收到以下错误消息:
错误信息非常清楚。我正在尝试使用一个不存在的对象,因为它由于声明了移动构造函数而被删除。但我仍然不明白这里发生了什么以及如何正确地做到这一点。有人可以启发我吗?
c++ - What ctor/assignment operator should a vector class have?
I'm writing my own vector class (a container for x, y values) and I'm not really sure what constructors/assignment operators I should implement on my own and what I can count on the compiler to provide. Obviously, I need to write any method that doesn't have the default behaviour or isn't auto-generated in any case. But sure enough, there's also no point in implementing something if the compiler can generate the exactly same thing.
I'm using Visual Studio 2010 (which might matter in the aspect of C++11). Also my class is a template one, if that matters.
Currently, I have:
Do I need copy ctor/assignment operator when I have a move ctor/move operator?
c++ - 为什么没有隐式生成的移动构造函数?
比如说,我有一个以可移动资源为成员的类:
有一个隐式生成的复制构造函数,它工作得很好,大致如下实现:
而且我希望在 C++11 中以相同的方式隐式生成移动构造函数:
但是,至少在 Visual Studio 2010 中不会隐式生成移动构造函数。并且在以下代码中复制了一个向量:
我的问题是——为什么?在我看来,编译器隐式生成移动构造函数的副本没有区别 - 它具有这两个的完整信息。
或者也许移动构造函数应该由标准生成,但 Visual Studio 不这样做?
更新
我调试了代码,并在文件vector(const _Myt& _Right)
中调用了构造函数。<vector>
当我显式编写移动构造函数时,vector(_Myt&& _Right)
会调用构造函数。
更新2
刚刚检查过:Visual Studio 2012 Update 1 中的行为相同。
更新3
好的,我同意这是重复的,但关闭原因中提供的链接不正确。评论中提供了正确的链接:为什么调用这个复制构造函数而不是移动构造函数?
这就是为什么,来自VC 博客:
右值引用 v3.0 添加了新规则,可以在特定条件下自动生成移动构造函数和移动赋值运算符。这不会在 VC11 中实现,它将继续遵循 VC10 的从不自动生成移动构造函数/移动赋值运算符的行为。(与此处所有尚未实现的功能一样,这是由于时间和资源限制,而不是由于不喜欢这些功能本身!)
c++ - 在具有统一初始化语法的 C++11 移动构造函数中使用 std::move
我有这个简单的课程:
这可以用 gcc-4.7.2 编译,但是如果我尝试使用这个版本,我会得到一个错误
为什么?