【问题标题】:is it fine to use auto keyword in function parameter?在函数参数中使用 auto 关键字可以吗?
【发布时间】:2015-06-09 11:54:44
【问题描述】:

我知道 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++ 中使用auto?”我想不出原因。
  • auto int 应该是什么意思?
  • 我能想到的唯一原因是,如果您有代码,如果 C++98/C++03 之间的静默变化之一,您特别需要在 C++11 模式下发出错误而 C++11 破坏了代码。但是,在这种情况下,如果使用 C++11,则带有 #error 的 #if 条件会更好地提高可读性。

标签: c++ c++11 auto


【解决方案1】:

在 C++ 11 之前,auto 关键字是 "storage class specifier",而在 C++ 11 中,它变成了 type-induction specifier。

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

【讨论】:

  • 嗯,在 C++11 之前,auto 作为存储类说明符。但它也是一个存储类说明符,与省略它没有什么不同......
【解决方案2】:

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

这取决于你所说的“很好”:

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

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

总之,不要这样做。

【讨论】:

    【解决方案3】:

    C++11 之前的auto 是存储类说明符,如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 时代的 C“默认情况下,类型是 int”。即,他们可能认为auto x; 表示auto int x;。然而,这不是有效的 C++03。在 C++03 模式下使用足够严格的标志进行编译应该会围绕 (ab) 使用 auto 产生错误。

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

    【讨论】:

      猜你喜欢
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      相关资源
      最近更新 更多