在函数参数中使用 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 说明符,如 register
或 static
或 extern
.
然而,它是默认存储 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 说明符。
我知道 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 说明符,如 register
或 static
或 extern
.
然而,它是默认存储 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
.
顺便说一句,C++11 还引入了一个新的存储 class 说明符 thread_local
。它窃取 auto
以使用自动类型变量,并且 auto
不再是存储 class 说明符。