在函数参数中使用auto关键字可以吗?
is it fine to use auto keyword in function parameter?
我知道auto
关键字的含义从c++ 11开始已经完全改变了。但是最近我写了一个简单的程序来编译&使用=std=c++98
选项编译时运行良好。
#include <iostream>
void fun(auto int a)
{
a=3;
std::cout<<a<<'n';
}
int main()
{
fun(3);
}
Orwell Dev c++ IDE给出如下警告:
[Warning] 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
所以,使用auto
作为函数参数是可以的,还是我应该永远不要像上面的程序那样使用auto
来保持与c++ 11的兼容性?
在c++ 11之前,auto
关键字是一个"存储类说明符",而在c++ 11之后,它变成了一个类型诱导说明符。
回答你的问题:根据你用来编译代码的c++标准,相应地调整auto
关键字的使用。
那么,是否可以使用auto函数参数,或者我应该永远不要像上面的程序那样使用auto来保持与c++ 11的兼容性?
这取决于你对"fine"的定义:
如果你的意思是"它会编译吗?",那么YES。
如果你的意思是"这是一个好做法吗",答案是它根本不是一种做法;这样做是可能的,而且代码是完全有效的(在c++ 11之前),但那个时代已经过去了,我不知道有人这样做过(甚至没有解决棘手的面试问题)。
结论, 不要。
auto
在c++ 11之前是一个存储类说明符,就像register
、static
或extern
一样。
是默认的存储类说明符。删除该关键字的有效c++ 03代码将具有相同的含义,这就是为什么c++ 11可以轻松地窃取关键字的原因。
简而言之:void fun1(auto int a) {
std::cout<<a<<'n';
}
void fun2(int a) {
std::cout<<a<<'n';
}
在c++ 03中具有相同的含义。在c++ 11中,fun1
是病态的。
只需将其从所有c++ 11之前的代码库中删除即可。如果代码是有效的c++ 03,它将继续具有相同的含义。
有一个(非常小的)问题,一些编译器可能会实现K&R era C"默认情况下,类型是int
"。也就是说,他们可能认为auto x;
就是auto int x;
。然而,这在c++ 03中是无效的。在c++ 03模式下使用足够严格的标志进行编译应该会在(ab)使用auto
时产生错误。
作为题外话,c++ 11还引入了一个新的存储类说明符thread_local
。它窃取了auto
对自动类型变量的使用,并且auto
不再是存储类说明符。
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- auto 关键字在 Dev c++ 中不起作用
- 为什么我需要明确编写"auto"关键字?
- 在C++中使用 auto 关键字
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 在 VS Code 中编码时不能在 C++ 中使用 auto 关键字
- 避免使用 auto 关键字从字面上复制 const 和非 const 的代码?
- 省略C++可变参数 lambda 中的"auto"关键字?
- 我可以在动态知道其类型的模板类对象中使用 auto 关键字吗?我不能在没有初始值设定项的情况下使用 auto 关键字吗?
- 使用 auto 关键字初始化字符数组
- auto*在编译时有用吗?auto关键字足够了吗
- lambda 中的跨平台"auto"关键字用法:integral_constant作为函数参数
- 使用 C++11 auto 关键字声明两个(或多个)变量
- C++11: "auto"关键字会检索到cv限定符吗?我有矛盾的样本
- 如何在C++中使用关键字"auto"声明和使用变量?
- 非常有用的关键字auto的使用
- 关键字"auto" C++和 C# "dynamic"
- 新关键字"auto" ;什么时候应该使用它来声明变量类型?
- 关键字"auto"接近临界点