STL容器的賦值運(yùn)算符可以更靈活嗎?
(轉(zhuǎn)載請注明來源于金慶的專欄)
STL容器如果元素類型不同是不能相互賦值的,
即使元素類型是兼容的.
如兩個list, 一個存放基類B指針, 一個存放派生類D指針:
class B {};
class D : public B {};
std::list<B*> lB;
std::list<D*> lD;
lB = lD; // ERROR!
編譯報錯
error: no match for 'operator=' in 'lB = lD'|
list.tcc|121|note: candidates are:
std::list<_Tp, _Alloc>& std::list<_Tp, _Alloc>::operator=(
const std::list<_Tp, _Alloc>&)
[with _Tp = B*, _Alloc = std::allocator<B*>]|
而boost::shared_ptr<B>與boost::shared_ptr<D>之間卻可以仍然保持兼容性.
以下賦值與指針賦值一樣是正確的.
boost::shared_ptr<B> pB;
boost::shared_ptr<D> pD;
pB = pD;
因?yàn)镾TL容器與boost::shared_ptr的賦值運(yùn)算符定義方式不一樣.
boost::shared_ptr賦值運(yùn)算符中參數(shù)的模板參數(shù)與類的模板參數(shù)不同,
所以支持更靈活的賦值.
boost::shared_ptr<T>& boost::shared_ptr<T>::operator=(
const boost::shared_ptr<Y>&)
只要改寫STL容器的賦值運(yùn)算符的參數(shù), 同樣可以擴(kuò)大靈活性.
例如將
list<_Tp,_Alloc>&
list<_Tp,_Alloc>::
operator=(const list& __x)
改為:
list<_Tp,_Alloc>&
list<_Tp,_Alloc>::
operator=(const list<_Tp2, _Alloc2> & __x)
不知為什么STL沒有放開這種靈活性?
(轉(zhuǎn)載請注明來源于金慶的專欄)
STL容器如果元素類型不同是不能相互賦值的,
即使元素類型是兼容的.
如兩個list, 一個存放基類B指針, 一個存放派生類D指針:
class B {};
class D : public B {};
std::list<B*> lB;
std::list<D*> lD;
lB = lD; // ERROR!
編譯報錯
error: no match for 'operator=' in 'lB = lD'|
list.tcc|121|note: candidates are:
std::list<_Tp, _Alloc>& std::list<_Tp, _Alloc>::operator=(
const std::list<_Tp, _Alloc>&)
[with _Tp = B*, _Alloc = std::allocator<B*>]|
而boost::shared_ptr<B>與boost::shared_ptr<D>之間卻可以仍然保持兼容性.
以下賦值與指針賦值一樣是正確的.
boost::shared_ptr<B> pB;
boost::shared_ptr<D> pD;
pB = pD;
因?yàn)镾TL容器與boost::shared_ptr的賦值運(yùn)算符定義方式不一樣.
boost::shared_ptr賦值運(yùn)算符中參數(shù)的模板參數(shù)與類的模板參數(shù)不同,
所以支持更靈活的賦值.
boost::shared_ptr<T>& boost::shared_ptr<T>::operator=(
const boost::shared_ptr<Y>&)
只要改寫STL容器的賦值運(yùn)算符的參數(shù), 同樣可以擴(kuò)大靈活性.
例如將
list<_Tp,_Alloc>&
list<_Tp,_Alloc>::
operator=(const list& __x)
改為:
list<_Tp,_Alloc>&
list<_Tp,_Alloc>::
operator=(const list<_Tp2, _Alloc2> & __x)
不知為什么STL沒有放開這種靈活性?