类型推导
- 在传统
C/C++
中,任何参数的类型都必须明确定义,这会使开发效率变慢,而且让代码变得冗长 C++11
引入了auto
和decltype
实现了类型推导
一、auto
-
使用
auto
进行类型推导的一个最为常见而且显著的例子就是迭代器,以前需要这样写:for(vector<int>::const_iterator itr = vec.cbegin(); itr != vec.cend(); ++itr)
有了
auto
之后可以:for(auto itr = vec.cbegin(); itr != vec.cend(); ++itr)
-
auto
常见用法auto i = 5; //auto被推导为int auto arr = new auto(10); //auto被推导为int *
-
auto
不可以用于函数传参,如下用法在C++11中是错误的int add(auto x, auto y) { return x+y; } int main() { cout<<add(5,6); return 0; }
不过在C++14中可以正常编译通过
int add(auto x, auto y) { return x+y; } int main() { cout<<add(5,6); return 0; }
输出
11
-
auto
不能用与推导数组类型int main() { int arr[10] = {0}; auto auto_arr = arr; auto auto_arr2[10] = arr; //错误 cout<<*auto_arr2; return 0; }
二、decltype
-
auto
关键字只能对变量进行类型推导,decltype
用法和sizeof
很相似int main() { auto x = 1; auto y = 2; decltype(x+y) z; //推导结果为int。z的类型为int。 return 0; }
-
如果需要写一个模板函数实现加法运算,你可能需要这样写:
template<typename R, typename T, typename U> R add(T x, U y) { return x+y; } int main() { cout<<add<int,int> (1,2); return 0; }
这样写会显得很冗长,复杂,在C++11中,可以写成如下形式:
template<typename T, typename U> auto add(T x, U y) -> decltype(x+y) { return x+y; } int main() { cout<<add<int,int> (1,2); return 0; }
当然,在C++14中,可以写的更精简:
template<typename T, typename U> auto add(T x, U y) { return x+y; } int main() { cout<<add<int,int> (1,2); return 0; }
或者干脆去掉模板:
auto add(auto x, auto y) { return x+y; } int main() { cout<<add(1.1,2); return 0; }