问题标签 [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 投票
1 回答
74 浏览

c++11 - 移动构造函数没有被调用?(C++11)

在下面的示例中,为什么在 fun 内部的 'copy' 构造中不调用 move 构造函数,即使 'fun' 的 'src' 参数明确是右值引用并且仅在该构造中使用?

0 投票
4 回答
1131 浏览

c++ - Uncopyable class with automatic default and move constructors

I want to make some classes use automatically generated constructors, but be non-copyable (but still movable). Currently I'm doing it like this:

I wonder if it's really necessary to be so explicit. What if I wrote it like this:

Would it still work the same? What is the minimal set of defaults and deletes for other cases - non-copyable non-movable class, and class with virtual destructor?

Is there any test code I can use to quickly see which constructors are implicitly created?

0 投票
1 回答
148 浏览

c++ - 两步复制省略以在构造函数调用中捕获右值作为实例变量

我正在尝试获取rvalue此类的一个实例:

x进入这个类的实例变量:

像这样:

没有任何复制或移动

根据这些参考资料,

还有很多关于 SO 的帖子(所以请在标记为重复之前阅读到最后),我应该依赖复制省略,如果我通过值传递应该满足其条件。请注意,需要两个复制省略,即:

constructor call -> constructor local variable -> instance variable

关闭复制省略时可以看到(使用 编译g++-4.8 -std=c++11 -fno-elide-constructors):

所以有一个move步骤和一个copy步骤,如果我打开复制省略(用 编译),这两个步骤都应该消失g++-4.8 -std=c++11 -O3

糟了,还剩copy一步!


我可以通过任何其他变体std::move()std::forward传递为更好rvalue-reference吗?

产生输出:

好的,我把copy变成了move但这并不令人满意!


接下来,我尝试使实例变量x成为引用X&

产生:

馊主意!我摆脱了move但引用的rvalue实例x在我的座位下被破坏了,所以最后一行打印垃圾而不是5. 两个注意事项:

  • g++-4.8没有警告我任何事情,即使有-pedantic -Wall -Wextra
  • 5程序在编译时打印-O0

所以这个错误可能会在很长一段时间内被忽视!


那么,这是一个没有希望的案例吗?没有:

印刷:

真的吗?没有花哨的新C++11功能,没有编译器自行决定的复制省略,只是普通的旧 FORTRAN66 样式的传递引用可以满足我的要求,并且可能会表现最好?

所以这是我的问题:

  • 有什么办法可以让它工作rvalues吗?我错过了任何功能吗?
  • -referencelvalue版本真的是最好的,还是有隐藏的成本?X x(6)
  • x建造后生活会不会带来任何不便f
  • 我可以为使用对lvalue外部实例的引用支付数据局部性罚款吗?
0 投票
3 回答
175 浏览

c++ - 临时 T 是否应该作为参数调用 C++11 中的 T(const T&) 或 T(T&&)?

所以,先写代码:

然后从 cygwin + gcc 4.8.2 输出,打开 C++11 功能:

我不太明白的是 x41 和 x51 的线。对于 x41,函数调用返回的临时值应该调用移动构造函数还是副本?x51的同样问题。
第二个问题是,通过查看输出,x41 和 x51 的构造没有调用任何定义的构造函数,但是对象显然是在内存中创建的。这怎么可能?

0 投票
2 回答
918 浏览

c++ - 在异常中不嵌入 std::string 的规则是否仍然适用于移动构造函数?

我前段时间听说我不应该创建具有类型字段的异常类std::string。这就是Boost网站所说的。基本原理是,std::string如果内存分配失败,复制构造函数可以抛出异常,如果在捕获当前处理的异常之前抛出异常,则程序终止。

但是,它仍然适用于移动构造函数吗?抛出异常时不会使用移动构造函数而不是复制构造函数吗?我是否正确理解使用 C++11 不会发生内存分配,不存在异常的机会并且std::string现在在异常类中绝对没问题?

0 投票
1 回答
333 浏览

c++ - 如何使用 grep 或 IDE 在代码库中查找移动构造函数?

我想在大型 c++ 项目的代码库中找到移动构造函数。简单地查找“&&”是行不通的,因为它匹配了很多“逻辑与”运算符。

有什么方法可以更精确地为移动构造函数 grep?

有什么方法可以使用 Visual Studio(在 Windows 上)或 XCode(在 Mac 上)搜索移动构造函数?

0 投票
3 回答
245 浏览

c++ - 为什么编译器需要一个复制构造函数,需要并且有移动一个并且不使用它们中的任何一个?

0 投票
2 回答
1309 浏览

c++ - 什么是 C++ 中的复制/移动构造函数选择规则?移动到复制回退何时发生?

0 投票
1 回答
166 浏览

c++ - 如何使用 Clang AST 工具在代码库中查找移动构造函数?

跟进这个问题的评论:如何使用 Clang AST 工具在 C++ 代码库中找到移动构造函数?(仅查找定义/声明)

0 投票
1 回答
109 浏览

c++ - 如何将 unique_ptr 用于数组

我有一堂课

为什么会这样?

我想这与移动构造函数有关(由于析构函数无法自动创建),但是为什么我们需要一个移动构造函数呢?

和有什么区别: