隐式转换在函数参数

时间:2017-01-04 22:24:05

标签: c++ parameters implicit-conversion function-parameter

#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 convertedstd::string::const_iterator e,但是当它作为函数参数传递时,必须明确地进行转换;否则在编译时会引发错误。那是为什么?

仅供参考,s.begin()s.end()似乎都返回std::string::iterator

  

表达式e可以隐式转换为T2当且仅当T2可以从e复制初始化时,即声明{{1}对于一些发明的临时T2 t = e;来说,格式良好(可以编译)。

2 个答案:

答案 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);

然后代码编译。