问题标签 [stdmove]
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++ - 什么是 std::move(),什么时候应该使用它?
- 它是什么?
- 它有什么作用?
- 什么时候应该使用它?
好的链接表示赞赏。
c++ - 我应该返回一个右值引用(通过 std::move'ing)吗?
一篇C++Next 博客文章说
如果A
具有可访问的副本或移动构造函数,编译器可能会选择省略副本。否则,如果A
有移动构造函数,v
则被移动。否则,如果A
有复制构造函数,v
则被复制。否则,会发出编译时错误。
我认为我应该始终返回该值,std::move
因为编译器将能够为用户找出最佳选择。但在博客文章的另一个例子中
这里std::move
是必要的,因为y
必须在函数内被视为左值。
啊,看完这篇博文,我的头都快炸了。我尽力去理解其中的道理,但我研究得越多,我就越困惑。为什么我们要在 的帮助下返回值std::move
?
c++ - 在 std::move 之后使用对象不会导致编译错误
在std::move
对象上调用之后,如果在之后使用对象,为什么语言不会导致编译错误?
是因为编译器无法检测到这种情况吗?
c++ - c ++使用数组而不调用构造函数
我的任务是创建一个模板类型数组而不调用 T(模板)构造函数。之后我想用 std::move 将一些值从另一个数组移动到这个数组。我怎样才能在 C++ 中做到这一点?这是我的代码:
但这行不通。编译器说明如下: 指向不完整类型“void”的指针的下标。
c++ - 为什么 C++ std::move 并没有真正对 std::initializer_list 中的元素进行强制转换?右值
在下面的函数中, doA被覆盖以接受std::string的const&和&&,doA_ 被覆盖以接受这两种类型的std::initializer_list。但似乎有问题的是,在第一个 doA_ 函数中,std::move 没有正确地将“std::string”转换为“std::string&&”,所以调用了第二个 doA,而不是第一个。即使我改用'doA(static_case(*it))',结果也是一样的。但是,如果我使用'doA("a string")',则调用第一个doA。为什么会这样?为什么他们的行为不同?
c++ - C++ 将 unique_ptr 移动到结构成员
我有以下程序 -
程序打印“FooBar”。我希望程序在 func() 返回时打印“Destroyed”,但事实并非如此。有人可以帮我解释为什么在这种情况下不会发生这种情况吗?
c++ - std::vector、std::move 和指针失效
我的问题与以下模式有关...我想使用以下模式来构造一个昂贵的构造SomeData
,然后将其移至UsesData
.
所以问题是...
中的指针是否ud.dat.m_ptrs
保证仍然有效?
c++ - 在 return 语句中构造对象时 std::move() 会帮助还是阻止 RVO?
由于来自社区的广泛响应,我提出这个问题是希望能够揭穿来自堆栈溢出用户的特定于实现的响应。
其中哪一个是最佳实践(提供最大的优化)?
编辑: 感谢 Yakk 的直接、尊重的回答。[接受答案]
c++ - C++:我应该在 return 语句中明确使用 std::move() 来强制移动吗?
编辑:它不是重复的,因为这个问题询问编译器在 O0 中的决定。
这里说名称返回值优化(NRVO)是许多编译器支持的优化。但它是必须的还是只是一个不错的优化?
我的情况是,为了方便调试,我想编译-O0
(即没有优化),但我也希望为返回对象(比如向量)的返回语句启用 NRVO。如果 NRVO 不是必须的,编译器可能不会在-O0
模式下执行此操作。在这种情况下,我应该更喜欢这段代码:
在下面这个?
编辑:我使用的编译器是 GCC6,但我希望代码独立于编译器。
c++ - 为什么 C++ 默认不移动构造右值引用?
说我有以下功能
为什么我需要用 转换param
回右值std::move()
?param
因为它在函数签名中被声明为右值引用,所以它的类型是右值不是很明显吗?不应该仅根据这个原则在这里自动调用移动构造函数吗?
为什么默认情况下不会发生这种情况?