#include <iostream>
#include <string>
int main() {
using std::string;
using std::distance;
using std::cout;
using std::endl;
string s("abc");
string::const_iterator b = s.begin();
string::const_iterator e = s.end(); // success
cout << distance(b, e) << endl;
cout << distance(b, static_cast<string::const_iterator>(s.end())) << endl;
cout << distance(b, s.end()) << endl; // error
return 0;
}
字符串s.end()
的结尾可以是implicitly converted到std::string::const_iterator
e
,但是当它作为函数参数传递时,必须明确地进行转换;否则在编译时会引发错误。那是为什么?
仅供参考,s.begin()
和s.end()
似乎都返回std::string::iterator
。
表达式
e
可以隐式转换为T2
当且仅当T2
可以从e
复制初始化时,即声明{{1}对于一些发明的临时T2 t = e;
来说,格式良好(可以编译)。
答案 0 :(得分:1)
模板函数参数不会被转换。 std::distance
的两个参数必须是相同的类型。
答案 1 :(得分:1)
该函数有一个模板参数
template <class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last);
因此它无法推断出模板参数的类型,因为迭代器const或非const可以用于每个函数参数。
你可以不用以下方式编写
std::distance<std::string::const_iterator>(b, s.end())
显式指定模板参数。
另一个例子。此代码段也不会编译
long x = 0;
int y = 0;
std::min(x, y);
但是如果你要写
long x = 0;
int y = 0;
std::min<long>(x, y);
然后代码编译。