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

dm7nw8vv  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(141)

当我在if中声明一个变量时,我的编译器会发出一个警告--但是它确实可以编译,尽管我使用的是c14,而不是正式引入这个特性的c17。
代码:

#include <iostream>
int foo(){
    return 1;
}

int main(){
    if (int x = foo(); x < 2){
        std::cout << "bla bla\n";
    }
    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实现了c17的特性,并且允许我在c++14中使用它,只是一个警告吗?
如果这是真的,在我的代码中使用它有什么坏处呢?我猜不是所有的编译器都会这么宽容,但是一旦代码被像我这样的宽容编译器编译,二进制代码就会像我期望的那样运行,(这是一个编译的可移植性问题,但没有运行时问题),对吗?

gudnpqoy

gudnpqoy1#

g 9.4.0实现了c17的特性,并且允许我在c++14中使用它,只是一个警告吗?
是的。
在我的代码中使用它有什么坏处呢?
因为其他编译器可能不同意。* 相同 * 的编译器在新版本中可能不同意。
编译器倾向于这样做,以使标准库的实现更容易。他们可能希望将所有if((int x = foo()))形式的if语句替换为if(int x = foo(); x)。他们只需禁用其头文件中的警告。
但是标准库实现是针对特定版本的编译器编写的,所以它们使用了编译器的细节,而其他人如果想编写可移植代码,就不能可靠地使用这些细节。如果你对依赖特定于编译器的行为没有意见,你可以使用这些细节。

相关问题