移动时保持类成员之间的指针稳定

时间:2019-06-05 05:39:03

标签: c++ move-semantics

假设一个类 C 有两个成员, M1 M2 ,其中 M1 持有一个指针 P 指的是 M2 。 对于 C 的每个实例 X ,以下不变量应成立: X.M1.P 指向 X.M2

是否有一种惯用的方法可以在C ++中实现此行为而无需实现move构造函数和赋值运算符?

我之所以问是因为,在我看来,指针 P 在概念上应该相对于 M1 。对于这种简单的概念,非默认的move构造函数和赋值运算符似乎需要大量工作(特别是如果成员很少)。

我的特定用例类似于以下示例(其中set M1 ,而less M2 )。也许我的基本方法是有缺陷的-有比在Relation中指向Less的指针更好的方法吗?

using Relation = std::vector<std::vector<bool>>;

class C {
 public:
  C() { /* less = ...; */ }
  C(C&&) = default;
  C& operator=(C&&) = default;

 private:
  struct Less {
    explicit Less(const Relation* r) : r(r) {}
    bool operator()(int i, int j) { return (*r)[i][j]; }
    const Relation* r;
  };

  Relation less;
  std::set<int, Less> set{Less(&less)};
};

C a;
std::cout << a.set.key_comp().r == &a.less << std::endl; // true
C b = std::move(a);
std::cout << b.set.key_comp().r == &b.less << std::endl; // false

0 个答案:

没有答案