【问题标题】:C++ Are pointers and/or references to a class considered "movable"?C++ 指向一个类的指针和/或引用是否被认为是“可移动的”?
【发布时间】:2017-06-13 06:05:30
【问题描述】:

我正在查找默认移动构造函数,并了解到某些类已删除默认移动构造函数。 http://en.cppreference.com/w/cpp/language/move_constructor

已删除隐式声明的移动构造函数

类 T 的隐式声明或默认移动构造函数定义为已删除,以下任何一项为真:

  • T 具有无法移动的非静态数据成员(已删除、不可访问或不明确的移动构造函数);

  • T 具有无法移动的直接或虚拟基类(已删除、无法访问或不明确的移动构造函数);

  • T 具有直接或虚拟基类,并带有已删除或不可访问的析构函数;

  • T 是一个联合体,并且有一个带有非平凡复制构造函数的变体成员;

所以当它说不能移动的数据成员时,它是否还包括对不可移动类的指针/引用?

【问题讨论】:

  • 不。 “不能移动”有一个非常精确的定义(在短语旁边的括号中)。

标签: c++ c++11 move


【解决方案1】:

指针和引用都是可复制和可移动的。
底层类型是否存在,没有区别。

考虑:

#include <iostream>
#include <utility>

class no_move_or_copy
{
public:
    no_move_or_copy(int i) : i(i) {}
    no_move_or_copy(const no_move_or_copy&) = delete;
    no_move_or_copy(no_move_or_copy&&) = delete;
    operator int() const { return i; }
private:
    int i;
};

class X
{
public:
    X(no_move_or_copy& i, no_move_or_copy& j) : i(i), j(&j) {}
    X(const X&) = default;
    X(X&&) = default;
    operator int() const { return i+*j; }
private:
    no_move_or_copy& i;
    no_move_or_copy* j;
};

int main()
{
    no_move_or_copy i{7}, j{8};
    X x(i,j);
    X y(x);
    X z( std::move(y) );

    std::cout << x << y << z << " done" << std::endl;
}

这将编译并产生输出

151515 done

指针和引用都不会因为被移动而改变。

online example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2021-11-05
    • 2013-05-07
    • 2019-10-06
    相关资源
    最近更新 更多