if内部的变量declassation-为什么它在c++14中工作



当我在if中声明变量时,我的编译器会发出警告,但它确实进行了编译,尽管我使用的是c++14,而不是正式引入此功能的c++17。

代码:

#include <iostream>
int foo(){
return 1;
}
int main(){
if (int x = foo(); x < 2){
std::cout << "bla blan";
}
return 0;
}

编译:

g++ ./bla.cpp --std=c++14 && ./a.out

编译器:

g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

警告:

bla.cpp: In function ‘int main()’:
bla.cpp:6:9: warning: init-statement in selection statements only available with ‘-std=c++17’ or ‘-std=gnu++17’
6 |     if (int x = foo(); x < 2){
|  

这有道理吗?g++9.4.0是否实现了一个c++17功能,并允许我在c++14中使用它而只发出警告?

如果这是真的,在我的代码中使用它有什么害处?我猜并不是所有的编译器都会如此简洁,但一旦像我这样的简洁编译器编译了代码,二进制文件就会像我预期的那样运行(这是一个编译的重要问题,但没有运行时问题),对吧?

g++9.4.0是否实现了一个c++17功能,并允许我在c++14中使用它而只发出警告?

是。

在我的代码中使用它有什么害处?

因为其他编译器可能不同意。相同的编译器在较新版本中可能不一致。

编译器倾向于这样做,以使实现标准库变得更容易。他们可能想要将其形式为if((int x = foo()))的所有if语句替换为if(int x = foo(); x)。他们只需禁用标题中的警告。

但标准库实现是针对特定版本的编译器编写的。因此,如果他们想编写可移植代码,他们会使用其他人无法可靠使用的编译器细节。如果您能够很好地依赖编译器特定的行为,那么您可以使用这些东西。

最新更新