为什么std :: sub_match <T>公开继承自std :: pair <T,T>?

Luc*_*lle 10 c++ regex boost c++11

我正在阅读文档,std::sub_match<BidirectionalIterator>并看到它公开继承自std::pair<BidirectionalIterator, BidirectionalIterator>.由于a sub_match只是一对迭代器变成一个字符序列,带有一些附加函数,我可以理解它是用一个实现的pair,但为什么要使用公共继承?

公开继承的问题与std::pair<T,U>从大多数其他标准类公开继承的问题相同:它们并不意味着以多态方式进行操作(特别是它们没有定义虚拟析构函数).其他成员也将无法正常工作,即赋值运算符和交换成员函数(它们不会复制matched成员sub_match).

为什么boost开发,然后委员会决定实施sub_match由公开继承pair,而不是使用成分(或私有继承使用声明,如果他们想继续保持成员访问过firstsecond)?

Jam*_*nze 5

这是一个有趣的问题.据推测,他们认为这是安全的,因为没有人会动态分配一个.关于获取sub_match对象的唯一方法是作为某些函数的返回值basic_regex,或者作为其他函数的副本 sub_match,所有这些都将是临时变量或局部变量.

请注意,保持sub_match对象无论如何都是不安全的,因为它们包含迭代器,其生命周期......似乎没有在标准中指定.直到match_results对象被重用?直到string填充match_results 对象的函数的 操作数被破坏?要么?

我仍然避免了公共遗产.但在这种情况下,它并不像它看起来那么危险,因为你真的没有理由想要动态分配一个sub_match.