问题标签 [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.

0 投票
3 回答
370 浏览

c++ - 具有副作用的 C++11 移动构造函数

在 C++ 中,不能依赖从 return 语句调用的复制构造函数,因为标准中的一个特殊子句允许编译器忽略对由 return 语句产生的复制构造函数的调用,即使复制构造函数有副作用。因此,编写一个除了复制构造实例之外做其他事情的复制构造函数是不好的风格。

C++11 标准中是否有类似的语句允许编译器在某些情况下消除对移动构造函数的调用 - 如果是这样,那些情况是什么?

0 投票
0 回答
206 浏览

c++ - 具有副作用的移动构造函数的替代方案?

我正在编写一个库,它提供一个类A并支持用它进行评估(基本上带有中缀符号的赋值和表达式)。让我们不要让事情不必要地复杂化,只看作业。用户可以执行以下操作:

同时,库还应该提供一个操作,让我们调用它fuse,它接受任意数量的此类语句:

有或没有 . 都应该使用相同的语法fuse。为了完成这项工作,我需要一个非标准的赋值运算符(一个不返回引用A但代表语句的对象)和一个单独的assign方法:

B试图包装一个语句。赋值操作是在销毁时触发的B

boolcalc跟踪该语句是否需要评估。然后该fuse操作带有可变参数块:

这种设置有一个严重的缺陷:它依赖于调用移动构造函数的编译器。由于复制省略规则,人们不能做这样的事情。

没有复制/移动构造函数怎么办?

0 投票
1 回答
645 浏览

visual-studio-2010 - VC10 unordered_set/map 移动构造函数错误?

似乎 VC10 (Visual Studio 2010) 下 unordered_set/map 的移动构造函数在被调用后将右侧置于未定义状态,导致其他操作(如“插入”)惨遭失败。移动赋值运算符似乎工作正常。不过,正常的集合/映射似乎在所有情况下都表现正确。此外,在 VC11 (Visual Studio 2012) 下一切似乎都运行良好。

这是 VC10 下 _Hash 实现的错误还是我遗漏了什么?提前感谢您的任何投入!

0 投票
3 回答
22697 浏览

c++ - 何时调用移动构造函数?

我对何时调用移动构造函数和复制构造函数感到困惑。我已阅读以下资料:

在 C++0x 中未调用移动构造函数

在 C++11 中移动语义和右值引用

微软

所有这些来源要么过于复杂(我只想要一个简单的例子),要么只展示如何编写移动构造函数,而不是如何调用它。我写了一个更具体的简单问题:

目前 A、B 和 C 都有不同的指针值。我希望 A 有一个新指针,B 有 C 的旧指针,C 有一个空指针。

有点离题,但如果有人可以建议我可以详细了解这些新功能的文档,我将不胜感激,并且可能不需要问更多问题。

0 投票
2 回答
3046 浏览

c++ - 为什么我需要在移动构造函数的初始化列表中使用 std::move?

假设我有一个(平凡的)类,它是可移动构造和可移动分配的,但不能复制构造或复制分配:

这工作正常:

当然,这不起作用,因为m1它不是右值:

但是,我可以换m1std::move,将其转换为右值引用,以使其工作:

到现在为止还挺好。现在,假设我有一个(同样微不足道的)容器类,它包含一个值:

但是,这不起作用:

编译器(我尝试过 clang 4.0 和 g++ 4.7.2)抱怨我试图在' 的初始化列表中使用movable' 已删除的复制构造函数。container再次,包装value使它std::move工作:

但为什么std::move在这种情况下需要?不是value已经类型了movable&&吗?有什么value_(value)不同movable m1(movable(42))

0 投票
1 回答
1846 浏览

c++ - 移动构造函数未按预期调用

我是 C++0x 的新手,我正试图围绕右值引用和移动构造函数。我正在使用带有-std = c ++ 0x的g ++ 4.4.6,我对以下代码感到困惑:

我发现正如所写,编译器使用复制构造函数在 main() 中构建对象。当我在 make_foo() 中使用 std::move 行时,在 main() 中使用了 move 构造函数。为什么在 make_foo() 中需要 std::move?我认为虽然 tmp1 和 tmp2 是 make_foo() 中的命名对象,但当它们从函数返回时,它们应该成为临时对象。

0 投票
1 回答
1103 浏览

c++ - volatile 和 virtual 成员如何影响 C++ 合成的 move 构造函数?

看下面的代码:

使用 gcc-4.6.1 编译时会产生以下错误:

据我了解,编译器无法在第 6 行创建默认移动或复制构造函数,如果我取消注释第 1 行或第 2 行,它编译得很好,这很清楚。该代码在没有 c++0x 选项的情况下编译良好,因此该错误与默认移动构造函数有关。

但是,节点类中的什么阻止了创建默认移动构造函数?如果我评论任何第 3 行或第 4 行(即使析构函数为非虚拟或使数据成员为非易失性)它会再次编译,那么这两者的组合是否使其无法编译?

另一个难题,第 5 行不会导致编译错误,与第 6 行有什么不同?都是gcc特有的吗?还是 gcc-4.6.1?

0 投票
3 回答
1193 浏览

c++ - 移动构造函数矫枉过正

我有一个类,它包含一个指向一大块已分配内存和许多原始类型成员的指针。我正在考虑移动构造函数,并认为这是使用它的绝佳机会。显然,指针应该被移过去,但如果使用原语是个好主意,那就别想了。

下面是该类的一个人为示例:

为了使它们可移动,它们必须被动态分配。

我的问题是,在堆上分配的开销是否会抵消移动语义引入的性能提升?

0 投票
3 回答
988 浏览

c++ - 按值返回时强制 RVO/移动构造

假设我有一个带有复制构造函数和移动构造函数的对象“foo”,以及一个函数

该标准似乎声明编译器将尝试执行以下操作:NRVO,按右值返回 ref,按值返回,失败;以该顺序。

有什么方法可以强制编译器永远不会按值返回,因为我的复制构造函数非常昂贵?

0 投票
1 回答
207 浏览

c++ - 既不复制也不移动构造函数调用

可能重复:
为什么在这种情况下不调用复制构造函数?
什么是复制省略和返回值优化?

谁能向我解释为什么以下程序会产生输出“cpy:0”(至少在使用 g++ 4.5.2 编译时):

当我试图弄清楚这个例子看似奇怪的结果时,问题就出现了:用常量数据成员或引用成员移动类的ctor