05 August 2022

C++ 核心指南目录

C.11: Make concrete types regular

理由

常规类型更易理解、更容易进行逻辑分析。

C++ 内置类型为常规类型,包括标准库里的类,比如 stringvectormap 。可以定义没有赋值运算符和相等运算符的具体类,但是不常见。

例子

struct Bundle {
    string name;
    vector<Record> vr;
};

bool operator==(const Bundle& a, const Bundle& b)
{
    return a.name == b.name && a.vr == b.vr;
}

Bundle b1 { "my bundle", {r1, r2, r3}};
Bundle b2 = b1;
if (!(b1 == b2)) error("impossible!");
b2.name = "the other bundle";
if (b1 == b2) error("No!");

如果具体类型是可复制的,最好为其添加相等运算符。这样确保a = b操作之后,a == b为真。

注意

如果某些结构体打算和 C 代码共享,那么添加operator==函数似乎就可行了。

注意

某些资源的句柄( handle )通常不能克隆,比如互斥锁的scoped_lock,虽然是具体类,但是通常不能复制。所以就不属于常规类型。这种类型往往只能移动。