在函数参数中使用auto关键字可以吗?

is it fine to use auto keyword in function parameter?

本文关键字:关键字 auto 函数 参数      更新时间:2023-10-16

我知道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之前是一个存储类说明符,就像registerstaticextern一样。

然而,

是默认的存储类说明符。删除该关键字的有效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不再是存储类说明符。