问题标签 [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 - 移动构造函数没有被调用?(C++11)
在下面的示例中,为什么在 fun 内部的 'copy' 构造中不调用 move 构造函数,即使 'fun' 的 'src' 参数明确是右值引用并且仅在该构造中使用?
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?
c++ - 两步复制省略以在构造函数调用中捕获右值作为实例变量
我正在尝试获取rvalue
此类的一个实例:
x
进入这个类的实例变量:
像这样:
没有任何复制或移动。
根据这些参考资料,
- http://thbecker.net/articles/rvalue_references/section_01.html
- http://www.slideshare.net/oliora/hot-11-2-new-style-arguments-passing
还有很多关于 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
吗?我错过了任何功能吗? - -reference
lvalue
版本真的是最好的,还是有隐藏的成本?X x(6)
? x
建造后生活会不会带来任何不便f
?- 我可以为使用对
lvalue
外部实例的引用支付数据局部性罚款吗?
c++ - 临时 T 是否应该作为参数调用 C++11 中的 T(const T&) 或 T(T&&)?
所以,先写代码:
然后从 cygwin + gcc 4.8.2 输出,打开 C++11 功能:
我不太明白的是 x41 和 x51 的线。对于 x41,函数调用返回的临时值应该调用移动构造函数还是副本?x51的同样问题。
第二个问题是,通过查看输出,x41 和 x51 的构造没有调用任何定义的构造函数,但是对象显然是在内存中创建的。这怎么可能?
c++ - 在异常中不嵌入 std::string 的规则是否仍然适用于移动构造函数?
我前段时间听说我不应该创建具有类型字段的异常类std::string
。这就是Boost网站所说的。基本原理是,std::string
如果内存分配失败,复制构造函数可以抛出异常,如果在捕获当前处理的异常之前抛出异常,则程序终止。
但是,它仍然适用于移动构造函数吗?抛出异常时不会使用移动构造函数而不是复制构造函数吗?我是否正确理解使用 C++11 不会发生内存分配,不存在异常的机会并且std::string
现在在异常类中绝对没问题?
c++ - 如何使用 grep 或 IDE 在代码库中查找移动构造函数?
我想在大型 c++ 项目的代码库中找到移动构造函数。简单地查找“&&”是行不通的,因为它匹配了很多“逻辑与”运算符。
有什么方法可以更精确地为移动构造函数 grep?
有什么方法可以使用 Visual Studio(在 Windows 上)或 XCode(在 Mac 上)搜索移动构造函数?
c++ - 如何使用 Clang AST 工具在代码库中查找移动构造函数?
跟进这个问题的评论:如何使用 Clang AST 工具在 C++ 代码库中找到移动构造函数?(仅查找定义/声明)
c++ - 如何将 unique_ptr 用于数组
我有一堂课
为什么会这样?
我想这与移动构造函数有关(由于析构函数无法自动创建),但是为什么我们需要一个移动构造函数呢?
和有什么区别: