重载分辨率如何适用于 std::vector:<int>:insert
How does overload resolution work for std::vector<int>::insert
这是来自 std::vector 的三个insert
方法签名中的两个:
void insert (iterator position, size_type n, const value_type& val);
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);
现在,给定一个向量和一个插入调用,
std::vector<int> v;
v.insert( v.begin(), 3, 3 );
为什么选择了第一个insert
而不是第二个?
天真地,我敢肯定 - 实现了相同的签名,但这里的第二个(模板化)形式是由编译器选择的。
template <class T, int MAXSIZE>
class svector {
public:
class iterator : public std::iterator<std::input_iterator_tag,T> { ... };
// ...
void insert (class iterator position, size_t n, const T& val){
if( len + n > MAXSIZE ) throw std::out_of_range( "insert exceeds MAXSIZE" );
uint32_t iPos = position - begin();
uint32_t movlen = len - iPos + 1;
for( uint32_t i = 0; i < movlen; i++ ){
ele[len + n - i] = ele[len - i];
}
for( uint32_t i = 0; i < n; i++ ){
ele[iPos + i] = val;
}
len += n;
}
template <class InputIterator>
void insert (class iterator position, InputIterator first, InputIterator last){
for( InputIterator it = first; it != last; it++ ){
if( len + 1 > MAXSIZE ) throw std::out_of_range( "insert exceeds MAXSIZE" );
*position = *reinterpret_cast<T*>( it );
}
}
你的阅读和编译器都是完全正确的。
标准库实现必须采取预防措施(通过std::enable_if
或更一般地通过 SFINAE),以确保仅为迭代器类型选择第二个重载。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中