Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ auto在C/C+中是否有用+;?_C++_C_Syntax_Keyword - Fatal编程技术网

C++ auto在C/C+中是否有用+;?

C++ auto在C/C+中是否有用+;?,c++,c,syntax,keyword,C++,C,Syntax,Keyword,有没有人见过在C/C++中显式使用的存储类auto?如果是,在什么情况下?自动在当前的C/C++中永远不会有用,因为所有变量都是隐式自动的。它在C++0x中很有用,在C++0x中,它可以完全替换类型声明-如果您有一个带有初始赋值的变量,“auto”将使其成为该赋值的类型,如注释中所示。否,如果您省略了类说明符,则假定为。我所能想到的唯一合理的用途是提醒人们注意一个特定的局部变量,它覆盖了(比如)一个同名的全局变量,或者作为一个访谈问题 很有可能,你会把一直在维护代码的可怜的程序员弄糊涂 在过去的

有没有人见过在C/C++中显式使用的存储类
auto
?如果是,在什么情况下?

自动在当前的C/C++中永远不会有用,因为所有变量都是隐式自动的。它在C++0x中很有用,在C++0x中,它可以完全替换类型声明-如果您有一个带有初始赋值的变量,“auto”将使其成为该赋值的类型,如注释中所示。

否,如果您省略了类说明符,则假定为。我所能想到的唯一合理的用途是提醒人们注意一个特定的局部变量,它覆盖了(比如)一个同名的全局变量,或者作为一个访谈问题


很有可能,你会把一直在维护代码的可怜的程序员弄糊涂

在过去的10多年中,我没有在编写的代码中使用过
auto
。没有理由使用
auto
,因为您只能在暗示的地方使用它。它仍然存在的唯一原因是为了向后兼容,但在新代码中应该避免使用它。

正如Alex所述,auto在C++0x中用于在初始化声明中声明类型,其中类型是从初始化代码推断出来的


有人建议将它也用作返回类型,其中类型是从返回值的代码推导出来的。然而,这引起了歧义,因此在编写本文时,正在考虑与C++0x的lambda语法更一致的东西。

在GCC中,您可能需要自动声明嵌套函数,以便能够在函数体中的任何位置定义它-请参见

以下是我用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;
    }
}
c_srgb在手册中查找(const c_HVC&HVC){
std::_Tree_迭代器b=munsell.mun_to_rgb_book.find(HVC);
if(b!=munsell.mun_to_rgb_book.end()){
c_srgbf=b->秒;
返回f;
}否则{
c_srgb ret;
ret.r=ret.g=ret.b=0;
返回ret;
}
}

你能举一个C++0x用法的例子吗?auto-funcptr=std::tr1::bind(&Foo::Bar,this,_1,_2);这声明“funcptr”与“bind”返回的类型相同(这是一种非常复杂的类型;在过去,您可以将其封装在std::tr1::函数模板中,但使用auto时,您不再需要这样做了)。这是一种特殊情况,还是像auto-someVar=functionthattreturnsunnowntype()?一般来说,它是有效的。基本上,它允许在初始化/施工现场进行变量类型推断。编译器已经为模板(模板无效FO(T t))做了这一点,而“Auto'”使它发生在函数体中。在页面的顶部,它表示GNU C++不支持嵌套函数。关于嵌套函数的自动填充是否适用于C++的其他实现?@ C0M4:假定嵌套函数的GNU C扩展与其他编译器不可用是最安全的。这不是“问题的存储类<代码> Auto <代码> >。我认为这是一个完全不同的问题。请注意,这一问题所涉及的功能在C++11中消失了,因此在这几年中没有“更新”也就不足为奇了(除了您提到的唯一非2008年的答案,顺便说一句,它回答了一个错误的问题)@LightnessRacesinOrbit足够公平了。我将收回我的标志,但我仍然认为它对那些在这个问题上遇到障碍的人是有用的,所以它可能应该是“相关:”-风格的注释。@Graham可能是相关的,对于C++11或更高版本的人: