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

时间:2015-06-09 11:54:45

标签: c++ c++11 auto

我知道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的兼容性?

3 个答案:

答案 0 :(得分:5)

在C ++ 11之前,auto关键字是"storage class specifier",而使用C ++ 11,它变为type-induction specifier

回答您的问题:根据您用来编译代码的C ++标准,相应地调整auto关键字的使用。它不能在C ++标准的前/后C ++ 11边界上移植。

答案 1 :(得分:4)

  

那么,将auto用于函数参数是否可以,或者我是否应该像上面的程序一样使用auto来保持与C ++ 11的兼容性?

这取决于你所说的“罚款”:

如果你的意思是“它会编译吗?”是的。

如果你的意思是“这是一个好习惯”,答案是它根本不是一种做法;有可能这样做并且代码完全有效(在C ++ 11之前)但是时间过去了,我不知道有谁做过这个(甚至不是那些棘手的面试问题)。

总之,不要这样做

答案 2 :(得分:0)

C ++ 11之前的

auto是一个存储类说明符,如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&amp; R时代C&#34;默认情况下,类型为int&#34;。也就是说,他们可能会将auto x;视为auto int x;。但是,这不是有效的C ++ 03。在C ++ 03模式下使用足够严格的标志进行编译会产生围绕({1}}使用{ab}的错误。

另外,C ++ 11还引入了一个新的存储类说明符auto。它窃取thread_local以使用自动类型变量,而auto不再是存储类说明符。