我正在阅读
从
为什么 Boost 开发人员以及委员会决定通过公共继承来实现
std::sub_match<BidirectionalIterator>
的文档,发现它公开继承自 std::pair<BidirectionalIterator, BidirectionalIterator>
。由于 sub_match
只是一对字符序列中的迭代器,并带有一些附加功能,我可以理解为什么要用 pair
实现它,但为什么要使用公共继承呢?从
std::pair<T,U>
公共继承会出现与从大多数其他标准类公共继承相同的问题:它们不应该被多态地操作(尤其是它们没有定义虚析构函数)。其他成员也将无法正常工作,特别是赋值运算符和交换成员函数(它们不会复制 sub_match
的 matched
成员)。为什么 Boost 开发人员以及委员会决定通过公共继承来实现
sub_match
,而不是使用组合(或私有继承和使用声明,如果他们想保留通过 first
和 second
进行成员访问)?
=
和swap
仍可能出现问题。例如,我考虑过使用Boost.Range,但它不要求范围可分配或可交换。值得注意的是,Boost.Range算法不接受sub_match
作为参数,但如果通过对pair
的引用进行操作,则可以这样做(特性类问题)。 - Luc Touraille