在构造函数中初始化成员时,是否应该在成员上使用 std::move?
Should std::move be used on members when initializing them in the constructor?
我一直在尝试完全理解移动语义,但我有一个问题,因为不同的示例显示了不同的东西。 假设我们有一个具有字符串成员str_的类 Foo。要定义移动构造函数,我应该这样定义它:
Foo(Foo&& foo) : str_(foo.str_) { }
或者这个:
Foo(Foo&& foo) : str_(std::move(foo.str_)) { }
另外,我是否需要将要从中移动的对象的成员设置为空白值?如何在不构造另一个字符串的情况下做到这一点,基本上抵消了首先使用 move 构造函数节省的费用?
您应该使用第二种方法。
您不必对从中移动的string
执行任何操作,因为这是由string
的 move 构造函数处理的。 后者由move()
调用调用。
你自己的类也是如此,任何你想move()
的东西都应该有一个移动构造函数。 例如,如果您的类具有指针成员,则 move 构造函数可以/应该将nullptr
分配给您从中move()
的对象中的该成员。
在移动构造函数(或移动赋值运算符(中,在移动单个成员时需要使用std::move()
(或者至少在非 POD 成员上,因为"移动"POD 类型与复制它相同(。
在Foo&& foo
中,foo
是一个右值引用,但foo.str_
不是。如果在移动构造函数中调用str_(foo.str_)
(或在移动赋值运算符中调用str_ = foo.str_
(,它将调用字符串的复制构造函数(或复制赋值运算符(。因此,您需要通过std::move()
将foo.str_
强制转换为右值引用,以便调用字符串的移动构造函数(或移动赋值运算符(。
移动构造函数(和移动赋值运算符(负责使 moved-from 对象处于未指定但有效的状态,因此其析构函数不会失败。 在移动foo.str_
成员的情况下,字符串的移动构造函数(或移动赋值运算符(将为您重置foo.str_
为空字符串,您无需手动重置它。
- std::ofstream 作为类成员删除复制构造函数?
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- std::to_string - 'to_string' 不是 'std' 的成员 - Visual Studio Code 1.42.0
- 使用 std::async 时死锁,将来作为成员
- 访问 std:vector 的类成员 std:vector 在一个类中与另一个 std:vector
- 将此类的智能指针追加到成员 std::vector
- 在Visual Studio中删除成员std::vector::d ata()
- C++初始化/填充静态成员 std::数组元素到特定值
- 是否可以在同一对象中对成员 std::shared_ptr 进行成员引用<variable>?
- 成员std::future防止boost::shared_ptr超出范围
- 在GCC中使用Brace Initializer初始化成员STD ::数组时错误
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- 获取指向成员std::string::size的指针无法与libc++链接,但可以与libstdc++一起使用
- 如何创建静态常量成员 std::string 数组
- 如何在构造函数初始值设定项列表中初始化“std::unique_ptr”对象的类成员“std::vector”
- C++ 编译失败,并显示错误:命名空间中没有名为 'snprintf' 的成员'std'
- 重载类下标运算符以访问成员std::vector对象的元素
- 构造类成员 std::vector<std::unique_ptr > 的智能方法<AClass>
- 使用成员std::vector移动语义
- 初始化类成员std::函数时编译错误