通过值传递临时时如何避免移动省略
How to avoid move elision when passing a temporary by value?
在以下代码中:
Widget makeWidget()
{
return Widget();
}
void foo(Widget widget)
{
...
}
foo(makeWidget());
Widget对象将始终在适当的位置构建(在foo函数内部),因此不会进行移动构建(至少在我尝试过的所有编译器中)。以移动构造实际发生的方式(不显式移动,即使用std::move)将临时值传递给函数的简单示例有哪些?
在这种情况下省略的标准是:
当尚未绑定到引用的临时类对象将被复制/移动到具有相同cv不合格类型的类对象时
因此,防止省略的一个简单方法是将其绑定到引用:
foo(std::move(makeWidget());
-fno-elide-constructors
。有了这个选项,这两个动作都将在示例代码中完成。
相关文章:
- C++避免重复声明的语法是什么
- 将对象移动到std::shared_ptr
- 是否可以避免在以下代码中复制/移动构造函数的需要?
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- 如何避免类成员的移动语义?
- 在CSCrollview移动时,如何避免闪烁
- 如何使用C 11移动语义以明确避免复制
- 移动功能体,避免完全克隆
- 通过值传递临时时如何避免移动省略
- 私有构造函数禁止使用template[_back]()来避免移动
- 平台独立性:它与将源代码从一个操作系统移动到另一个操作系统有何不同
- C++ 移动构造函数和常量成员指针或常量成员,如何对它们进行 NULIZE 以避免内存泄漏
- 如何避免在调试宏中移动构造函数
- 如何避免 lambda 函数中的隐式移动构造函数
- C++:在共享所有权的情况下,C++11移动语义可以避免指针吗
- 使用 C++11 复制和移动时避免代码重复
- 初始化数组时,我可以避免c++11移动吗
- 移动语义以避免临时对象的创建
- 避免在调整大小时移动控件的对话框上闪烁
- C++11编译器何时会使RVO和NRVO优于移动语义和常量引用绑定