-
总览
-
必须赋值
-
复杂变量类型简单化
-
说明
- 复杂的内置变量类型声明很长一串,还不一定对.用
auto
比较合适.
- 复杂的内置变量类型声明很长一串,还不一定对.用
-
案例一
#include<vector> template <typename Iter> void foreach(Iter b, Iter e) { while (b != e) { std::iterator_traits<Iter>::value_type value = *b; b++; } } int main() { char s[10]; foreach(s, s + 10); return 0; }
- 编译报错,一大串的从属类型,必须用
typename
关键字声明后面的是类型而不是变量名才可以.
- 编译报错,一大串的从属类型,必须用
-
案例二
#include<vector> template <typename Iter> void foreach(Iter b, Iter e) { while (b != e) { typename std::iterator_traits<Iter>::value_type value = *b; b++; } } int main() { char s[10]; foreach(s, s + 10); return 0; }
- 一大长传,还不一定对。可能还会涉及到拷贝.
-
案例三
#include<vector> template <typename Iter> void foreach(Iter b, Iter e) { while (b != e) { auto value = *b; b++; } } int main() { char s[10]; foreach(s, s + 10); return 0; }
- 没有复杂的类型声明,很简单的解决了问题。
-
-
lambda
-
说明
lambda
是一个局部类型,类型和变量名和所在环境相关.- 命名也不一样,可以通过反汇编或者
objdump -d
查看对应符号名.
-
案例一
int main() { auto s = []() {}; decltype(s) t = s; return 0; }
- 成功,类型推导赋值。
-
案例二
int main() { auto s = []() {}; s = []() {}; return 0; }
- 编译错误,类型不匹配.
template<typename T> void show(T&& t) { t.error(); } int main() { auto s = []() {}; auto p = []() {}; show(s); show(p); return 0; }
- 编译的结果是,两个类型不一样,是一个
hash
值.
-
案例三
int main() { auto s = [](int a,int b) {}; return 0; }
C++11
的简单版本。
int main() { auto s = [](auto a,auto b) {}; return 0; }
C++14
的更简单版本,特别是在函数特别复杂的时候.
-
-
auto
比std::function
更优 -
溢出
-
隐式转换
-
总结
auto的优势
最新推荐文章于 2024-11-06 16:02:10 发布
本文讨论了C++中auto关键字的使用,强调了它在简化代码、提升效率和减少错误方面的作用。提倡在大多数情况下使用auto,特别是在处理模板、lambda表达式和复杂类型时。然而,也提醒注意潜在的类型推断错误、内存分配问题和隐式转换带来的效率损失。文章通过实例展示了auto如何简化复杂类型声明,并对比了auto与std::function的优劣,指出auto在某些场景下能更好地平衡简洁性和性能。
摘要由CSDN通过智能技术生成