編譯器: MSVC v142
所屬文件: xutility
位置(行): 218
函數(shù)描述: 利用編譯器自帶的ADL查找規(guī)則, 找到與類型參數(shù)相匹配的重載函數(shù).
template <class _Iter, class _Sentinel>
constexpr void _Adl_verify_range(const _Iter& _First, const _Sentinel& _Last) {
_Verify_range(_First, _Last);
};
?
_Verify_range (采樣vector)
_Verify_range
函數(shù)分布在不同的位置(vector
/deque
/list
/forward_list
/xstring
/forward_list
),
它們以友元friend
函數(shù)形式存在, 也就是說(shuō)即便它們的名稱都是一樣的, 只要它們的參數(shù)類型定義是不同的, 那么它們就是多態(tài)存在的.
friend void _Verify_range(const _Vector_const_iterator& _First,
const _Vector_const_iterator& _Last) {
// 斷言確保這兩個(gè)類型參數(shù)是同一個(gè)iterator實(shí)例對(duì)象.
_STL_VERIFY(_First._Getcont() == _Last._Getcont(),
"vector iterators in range are from different containers");
// 斷言確保兩個(gè)指針的先后順序, 避免出現(xiàn)倒掛情況.
_STL_VERIFY(_First._Ptr <= _Last._Ptr,
"vector iterator range transposed");
}
?
踩坑記錄
最開始我不知道 _Adl_verify_range 是通過(guò) ADL 來(lái)查找 _Verify_range 函數(shù), 甚至在 stackoverflow 上提交了問(wèn)題, 最終也得到了回復(fù)和指導(dǎo).
隱形的坑就是, 我以為友元函數(shù)或者
下面是我測(cè)試 _Verify_range 函數(shù)的樣例代碼:
#include <iostream>
#include <vector>
#include <algorithm>
using std::vector;
using std::cout;
using std::endl;
using std::back_inserter;
int main(void) {
vector<int> coll1 {1, 2, 3, 4};
const auto start = coll1.cbegin();
const auto stop = coll1.cend();
// 因?yàn)檫@個(gè) coll1.cbegin() 和 coll1.cend() 生成出來(lái)的是一對(duì) vector_const_iterator 對(duì)象.
// 所以匹配到的是 vector 對(duì)象的 _Verify_range 友元函數(shù).
_Verify_range(start, stop);
return 0;
}