caution c ++ auto
自动关键字在c 11中引入,用于自动推导变量类型,降低代码复制和提升的致命性。1. 使用auto时必须初始化变量,否则无法推导类型;2. 可结合引用、指针和const使用,但不会赚到const;3. 在复杂类型如迭代器、lambda 表达式中特别有用,节省写作时间;4. 推导结果可能因上下文不同而变化,需要注意潜在的类型问题,例如size()返回无符号类型或初始化列表的不同推导结果。合理使用auto可以提高代码简洁性,但关键位置仍需明确类型错误。
auto关键字在C 11引入后,成了简化代码、提升竞争力的一个实用工具。它的主要是让编译器自动推导作用的类型,而不是手动写出完整的类型名。最办法:声明变量时省基本类型
当你在声明声明并同时初始化时,可以用auto代替具体的类型:auto i = 42; // i 的类型被推导为 intauto d = 3.14; // d 的类型是 doubleauto s = quot;helloquot;; // s 是 const char*登录后复制
这里的关键点是必须初始化,否则编译器无法知道你让它推什么类型。
立即学习“C 免费学习笔记(深入)”;
常见错误写法:auto x;→ 编译失败,因为没有初始化表达式,无法推导类型匹配引用和const使用
auto不仅仅用来推基本类型,还可以结合引用、指针、const等复合类型一起使用:int val = 10;autoamp; ref = val; // 推导为 intamp;const auto c = val; // 推导为 const intauto* ptr = amp;val; // 推导为int*登录后复制
注意一点:auto不会获得陌生的const,但可以加上自己的限定符。比如:const int a = 10;auto b = a; // b 是 int,不是 const intautoamp; c = a; // c 是 const intamp;登录后复制在复杂类型中节省书写面对时间
当复杂的类型时,auto扩展就特别有用,比如迭代器、lambda表达式返回值或者模板类型:std::maplt;std::string, std::vectorlt;intgt;gt;data;for (auto it = data.begin(); it != data.end(); it) { // 这里 it 的类型其实是 std::maplt;std::string, std::vectorlt;intgt;gt;::iterator}登录后复制
不用再写一大串前缀模板类型,自动求助搞定。类似地:auto lambda = [](int x) { return x * x; };登录后复制
lambda的类型是编译器生成的匿名类,根本没法手动写出来,这个时候只能靠auto。注意:推导结果可能不如预期
虽然方便,但也要小心别让auto掩盖了类型问题。
譬如:auto index = vec.size(); // 如果是 vectorlt;intgt;,那 size() 返回的是 size_t(无符号)登录后复制
如果你之后把这个值去比较有符号数,可能会出现很隐式的转换。
另一个例子是初始化列表:auto x1 = {1, 2, 3}; // 类型是 std::initializer_listlt;intgt;auto x2{1, 2, 3}; // 同上auto x3 = {5}; // 类型还是initializer_listlt;intgt;auto x4{5}; // C 17起,x4是int,不再是 initializer_list登录后复制
不同的写法可能会导致不同的推导结果,这一点要特别注意。
总的来说,自动是个好帮手,可以让你的代码清晰。但在关键位置还是要明确类型,避免因类型推导导致逻辑错误。基本上就这些,不复杂但容易忽略的地方还挺多。
以上就是C的汽车关键字怎么用?能推导什么?的详细内容,更多请关注乐哥常识网其他文章!