Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++ 是C++;11自动类型危险?_C++_C++11_Auto - Fatal编程技术网

C++ 是C++;11自动类型危险?

C++ 是C++;11自动类型危险?,c++,c++11,auto,C++,C++11,Auto,可能重复: 在C++11中,键入一个变量auto,而不是,比如说,int,将使编译器自动使用从初始化上下文推导出的正确类型。这在类型明显但写起来枯燥的情况下非常方便。有没有需要注意的陷阱,或者为什么有人会避免使用它?我个人的经验是,auto对于通用代码或类似基于范围的for循环非常方便,但您可能会得到类似的结果 auto count = getCount(); if (count < 0) { // do something } auto count=getCount(); 如果

可能重复:


在C++11中,键入一个变量
auto
,而不是,比如说,
int
,将使编译器自动使用从初始化上下文推导出的正确类型。这在类型明显但写起来枯燥的情况下非常方便。有没有需要注意的陷阱,或者为什么有人会避免使用它?

我个人的经验是,auto对于通用代码或类似基于范围的for循环非常方便,但您可能会得到类似的结果

auto count = getCount();
if (count < 0) {
  // do something
}
auto count=getCount();
如果(计数<0){
//做点什么
}

如果getCount()返回的是一个无符号数字,而不是您可能期望的数字(int),则您甚至不会收到警告。

如果您期望得到的类型是初始值设定项表达式的类型,则应该没有问题。问题是,这不是你有时所期望的。一个主要的陷阱是
auto
允许你从某个类中提取
private
类型。通常情况下,此类类型(例如代理)的设计目的仅限于某些特殊用途和特殊方式。对于C++03,必须使用漂亮的模板技巧才能访问此类类型,但对于C++11
auto
来说,不幸的是,在无意中很容易做到。。。干杯,我喜欢用“自动”作为迭代器。我不知道它是否安全,但我没有遇到任何问题。你只需要知道会发生什么。虽然如果您使用的是使用auto初始化的类的方法,但如果这些方法不存在,编译器可能会提醒您,因为它不是正确的类。添加auto的主要原因不是因为类型明显且编写起来很枯燥,添加它是为了在类型不明显且难以编写的情况下提供帮助!投票决定重新开放。这些线索似乎没有讨论这些危险。Alf提出了一个非常重要的问题,应该在回答这个问题时加以解决。-使用“自动”会让程序员意外地获得他们从未见过的类型,从而破坏程序。你是对的,但实际上,如果你用
int
替换
auto
,你也不会得到警告。GCC会用
-Wextra
给我一个警告,这就是我总是使用该框架构建的原因(与
-Wall
)一起使用。@Joachim Pileborg在这种情况下,您还可以通过
auto
获得警告。