CppCoreGuidelines C.11 编写常规的具体类型
05 August 2022
C.11: Make concrete types regular
理由
常规类型更易理解、更容易进行逻辑分析。
C++ 内置类型为常规类型,包括标准库里的类,比如 string
, vector
, map
。可以定义没有赋值运算符和相等运算符的具体类,但是不常见。
例子
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
,虽然是具体类,但是通常不能复制。所以就不属于常规类型。这种类型往往只能移动。