C++标准库 _Adl_verify_range

编译器: MSVC v142
所属文件: xutility
位置(行): 218
函数描述: 利用编译器自带的ADL查找规则, 找到与类型参数相匹配的重载函数.

template 
constexpr void _Adl_verify_range(const _Iter& _First, const _Sentinel& _Last) {
    _Verify_range(_First, _Last);
};

 

_Verify_range (采样vector)

_Verify_range函数分布在不同的位置(vector / deque / list / forward_list / xstring / forward_list),
它们以友元 friend 函数形式存在, 也就是说即便它们的名称都是一样的, 只要它们的参数类型定义是不同的, 那么它们就是多态存在的.

friend void _Verify_range(const _Vector_const_iterator& _First, 
                          const _Vector_const_iterator& _Last) {
   
    // 断言确保这两个类型参数是同一个iterator实例对象.
    _STL_VERIFY(_First._Getcont() == _Last._Getcont(), 
                "vector iterators in range are from different containers");

    // 断言确保两个指针的先后顺序, 避免出现倒挂情况.
    _STL_VERIFY(_First._Ptr <= _Last._Ptr, 
                "vector iterator range transposed");
}

 

踩坑记录

最开始我不知道 _Adl_verify_range 是通过 ADL 来查找 _Verify_range 函数, 甚至在 stackoverflow 上提交了问题, 最终也得到了回复和指导.
隐形的坑就是, 我以为友元函数或者
下面是我测试 _Verify_range 函数的样例代码:

 #include 
 #include 
 #include 
 using std::vector;
 using std::cout;
 using std::endl;
 using std::back_inserter;
 
 
 int main(void) {
 
     vector coll1 {1, 2, 3, 4};
 
     const auto start = coll1.cbegin();
     const auto stop = coll1.cend();
 
     // 因为这个 coll1.cbegin() 和 coll1.cend() 生成出来的是一对 vector_const_iterator 对象.
     // 所以匹配到的是 vector 对象的 _Verify_range 友元函数.
     _Verify_range(start, stop);

     return 0;
 }

你可能感兴趣的:(C++标准库 _Adl_verify_range)