在函数参数中使用 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 关键字是 "storage class specifier" whereas with C++ 11 it becomes a type-induction specifier.

回答您的问题:根据您用来编译代码的 C++ 标准,相应地调整 auto 关键字的使用。它不能跨越 C++ 标准的 pre/post C++ 11 边界。

So, is it fine to use auto for function parameters or should I never use auto like this as in above program to maintain compatibility with C++11?

这取决于你的意思 "fine":

如果你的意思是 "will it compile?" 那么是。

如果你的意思是"is it a good practice",答案是这根本不是一种做法;这样做是可能的,并且代码完全有效(在 C++11 之前),但那个时代已经过去了,我不知道有谁这样做过(即使是棘手的面试问题也不行)。

总之,不要这样做

auto 在 C++11 之前是存储 class 说明符,如 registerstaticextern.

然而,它是默认存储 class 说明符。删除它的有效 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 "by default, a type is int"。也就是说,他们可能会认为 auto x; 意味着 auto int x;。然而,这不是有效的 C++03。在 C++03 模式下使用足够严格的标志进行编译应该围绕 auto.

的(ab)使用产生错误

顺便说一句,C++11 还引入了一个新的存储 class 说明符 thread_local。它窃取 auto 以使用自动类型变量,并且 auto 不再是存储 class 说明符。