我正在閱讀std::sub_match<BidirectionalIterator>
的文檔,看到它公開繼承std::pair<BidirectionalIterator, BidirectionalIterator>
。由於一個sub_match
只是一對迭代器到字符序列中,並且有一些額外的功能,我可以理解它是用pair
實現的,但是爲什麼使用公共繼承?爲什麼std :: sub_match <T>公開繼承std :: pair <T, T>?
公開從std::pair<T,U>
公開繼承的問題與從大多數其他標準類公開繼承的問題相同:它們不是要被多形地操縱(特別是它們沒有定義虛擬析構函數)。其他成員也將無法正常工作,即分配操作員和交換成員功能(他們不會複製成員sub_match
)。
爲什麼boost開發,然後委員會決定由pair
公開繼承,而不是使用成分(或私有繼承使用聲明,如果他們想通過first
和second
保持成員訪問)來實現sub_match
?
我同意應該可能永遠不會發生的動態分配。但是,使用'='和'swap'仍然可能會出現問題。例如,我在考慮Boost.Range,但它不要求範圍是Assignable或Swappable。然而,值得注意的是,Boost.Range算法不接受'sub_match'作爲參數,但如果通過引用'pair'(特徵類問題)來操作它們,則這樣做是有用的。 –