为什么C++20特性designated initialization能在C++11/17编译选项下通过GCC编译?
解答
指定初始化确实是C20才正式纳入ISO C标准的语法特性,你遇到的低版本标准可编译的情况完全是GCC编译器的扩展特性导致的:
- C99标准早已支持指定初始化,GCC为了方便C/C混合场景的代码复用,在C编译模式下默认提供了该特性的非标准扩展支持,即便是指定
-std=c++11/-std=c++17等低于C++20的标准版本时,该扩展默认也是开启状态。 - 如果你需要让编译器严格遵循对应版本的C标准,禁止使用非标准扩展,可以在编译参数中添加
-pedantic(输出警告)或者-pedantic-errors(直接抛错误):
例如使用命令g++ -Wall -Werror -std=c++17 -pedantic-errors -o main main.cc编译你的代码时,就会收到明确的编译错误,提示指定初始化在当前选择的C标准版本中不可用。
注:不止指定初始化,GCC还提供了大量其他非标准扩展,开启
-pedantic系列参数可以有效帮助你写出跨编译器兼容的标准C++代码。
内容的提问来源于stack exchange,提问作者Headal
相关产品推荐
相关产品推荐

