c++ - 临时对象中的成员变量是否尽可能隐式 move ?

标签 c++ c++11 move-semantics rvalue

在我的类中,我使用 std::vector 等作为成员变量,它们带有自己的 move 构造函数。我没有为我的类显式声明 move 构造函数,而且它们大部分都没有隐式声明。

如果使用右值调用我的类的隐式复制构造函数或隐式赋值运算符,是否复制或 move 了具有 move 构造函数的成员?

如果它们被 move ,在使用具有可 move 可构造成员的类时是否有任何理由试图避免临时对象?

最佳答案

如果您的类没有显式声明 move 构造函数/赋值运算符并且它们也没有隐式声明,那么隐式声明的复制构造函数/赋值运算符将不会 move 成员,而是复制它们。

如果为您的类隐式声明 move 构造函数/赋值操作,它们将被 move 。你说他们不是——为什么?你的类有自定义析构函数吗?您应该争取一种不需要自定义 dtor、复制/move ctor 和复制/move 赋值操作的设计 - 有时称为“零规则”。

如果你确实需要一个自定义的 dtor,你应该显式地声明 move ctor/assignment-op 来使用 move 语义。如果您的编译器支持,您可以将它们声明为默认值。

关于c++ - 临时对象中的成员变量是否尽可能隐式 move ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16612069/

相关文章:

c++ - 从 C++ 公开的 Windows 性能计数器总是在 perfmon.exe 中产生 "Can' t 负载计数器

c++ - 如何使用 std::lock_guard 锁定对 std::map 的读写访问?

c++ - 静态 constexpr 方法实现导致 gcc 错误?

c++ - 如何定义一个函数来处理 move 语义和复制语义?

c++ - 使用 if 语句 move 构造函数,但使用三元运算符复制构造函数

c++ - (缺少)使用 C++11 move 语义的性能改进

c++ - 调用 CMD.exe 后立即返回的 VC++ std::system() API

c++ - 使用 utf-32 解析器在 Boost.Spirit 中处理 utf-8

c++ - 微:Bit Serial read

c++ - 包含非平凡成员 union 的类的构造函数和复制构造函数