有没有人见过auto
在 C/C++ 中明确使用的存储类?如果有,在什么情况下?
6 回答
auto 在当前的 C/C++ 中从来没有用过,因为所有变量都是隐式自动的。它在 C++0x 中很有用,它可以完全替换类型声明 - 如果您有一个带有初始赋值的变量,'auto' 只会使其成为该赋值值的类型,如注释中所示。
我没有看到auto
在过去 10 多年编写的代码中使用过。没有理由使用它,auto
因为您唯一可以使用它的地方就是它暗示的地方。它仍然存在的唯一原因是为了向后兼容,但在新代码中应该避免它。
在 GCC 中,您可能需要 auto 来声明嵌套函数,以便能够在函数体中的任何位置定义它 - 请参阅http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Nested-Functions.html
不,假设您省略了类说明符。我能想到的唯一合理的用途是提醒人们注意一个特定的局部变量,它会覆盖一个同名的全局变量,或者作为一个面试问题。
很有可能,你会让那些坚持维护代码的可怜程序员感到困惑!
正如 Alex 所介绍的,auto 在 C++0x 中用于在初始化声明中声明类型,其中类型是从初始化代码中推断出来的。
有人提议将它也用作返回类型,其中类型是从返回值的代码中推导出来的。然而,这引起了歧义,因此在撰写本文时,正在考虑与 C++0x 的 lambda 语法更一致的东西。
这是我的代码中的一个示例,用 C++11 编写:
c_srgb find_in_book(const c_HVC &HVC) {
auto b = munsell.mun_to_rgb_book.find(HVC);
if( b != munsell.mun_to_rgb_book.end()) {
c_srgb f = b->second;
return f;
} else {
c_srgb ret;
ret.r=ret.g=ret.b=0;
return ret;
}
}
我更喜欢这个:
c_srgb find_in_book(const c_HVC &HVC) {
std::_Tree_iterator<std::_Tree_val<std::_Tmap_traits<dj::color::c_HVC,dj::color::c_srgb,std::less<dj::color::c_HVC>,std::allocator<std::pair<const dj::color::c_HVC,dj::color::c_srgb>>,false>>> b = munsell.mun_to_rgb_book.find(HVC);
if( b != munsell.mun_to_rgb_book.end()) {
c_srgb f = b->second;
return f;
} else {
c_srgb ret;
ret.r=ret.g=ret.b=0;
return ret;
}
}