本文共 1588 字,大约阅读时间需要 5 分钟。
auto
,而非显式类型声明在 C++ 编程中,显式地声明变量的类型虽然直观,但也存在一系列问题。我们将探讨使用 auto
的优势,以及如何让 auto
的推导行为更安全、更高效。
显式类型声明如下:
int x; // 未初始化或初始化为 0,视语境而定templatevoid dwim(It b, It e) { while (b != e) { typename std::iterator_traits ::value_type currValue = *b; … }}
缺点包括:
auto
声明变量,必须初始化。auto
的解决方案使用 auto
后,许多问题得到解决:
auto x3 = 0; // 正确初始化void dwim(It b, It e) { while (b != e) { auto currValue = *b; // 正确推导类型 … }}
闭包变量的优化:
auto derefUPLess = [](const std::unique_ptr/widget>& p1, const std::unique_ptr(widget>& p2) { return *p1 < *p2;};
auto
的优势:
确保变量的类型在编译时可靠:
std::vector v;unsigned sz = v.size();// 可能导致问题:`size_type` 在 32 位系统中为 32 bitsauto sz = v.size(); // 正确
std::unordered_map
的使用问题:
for (const auto& p : m) { // 正确处理}
使用 auto
能直接取元素地址:
for (const auto& p : m) { // 正确引用元素地址}
在某些情况下,auto
可能导致非预期类型推导:
bool highPriority = features(w)[5]; // 正确
如果改为:
auto highPriority = features(w)[5]; // 错误!
features(w)[5]
返回 std::vector<bool>::reference
,在强制转换为 bool
后 highPriority
为正确类型:
auto highPriority = static_cast(features(w)[5]); // 正确!
提示:对
std::vector<bool>
的operator[]
返回的对象为隐式代理类,避免直接演示auto
推导到代理类型。
在必要时,使用 auto
并强制类型转换:
auto highPriority = static_cast(features(w)[5]); // 正确!
auto
作为现代 C++ 的强大工具,能够简化代码并提高效率。请谨慎使用 auto
,并在非预期类型推导时,进行显式类型转换,以确保代码的安全性与可靠性。
转载于:https://www.cnblogs.com/gqtcgq/p/9733453.html