尽管有更新,clang还是会发出关于c++11的警告

clang produces warning regarding c++11 despite update

本文关键字:出关 c++11 警告 更新 clang      更新时间:2023-10-16

最近更新了clang(以及xcode和开发工具),并运行了一个简单的程序来查看它是否支持c++11。看起来像这样:

#include <iostream>
using namespace std;
int main()
{
string my_array[5] = {"one", "two", "three"};
for (string &x : my_array)
cout << x << endl;
}

在终端中编译如下:

clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

并得到这个警告:

main.cpp:17:20: warning: range-based for loop is incompatible with C++98
[-Wc++98-compat]
for (string &x : my_array)

但它仍然生成一个可执行文件并按预期运行。为什么会产生此错误?

这是一个警告而非错误。警告消息还指示启用它的警告标志:-Wc++98 compat。启用此标志是因为您启用了-Weverything(一个好主意,IMO)。要禁用特定的警告,您可以在要禁用的警告名称前传递一个前缀为"no-"的警告标志:

-Wno-c++98-compat

此警告的目的是允许将代码构建为C++11,并获得一些C++11的好处,例如通过移动语义提高性能,同时仍然生成与旧编译器兼容的代码。也就是说,这个警告并不表示程序有任何问题,程序将像C++11规范所指示的那样工作(当然,除了clang bug),但警告是为了通知您,如果您要编译为C++98,那么它将不工作。

如果你不打算将代码构建为C++98,那么这个警告对你没有任何价值,你应该简单地禁用它。

我相信在最新版本中也有一个-Wc++11兼容标志,现在clang支持(可能会被称为)C++14。