假设一个类 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