C++ 叮当声产生关于c+的警告+;11尽管有更新

C++ 叮当声产生关于c+的警告+;11尽管有更新,c++,c++11,clang,clang++,C++,C++11,Clang,Clang++,最近更新了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 &l

最近更新了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)。要禁用特定警告,请在要禁用的警告名称前传递一个前缀为“否-”的警告标志:

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

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


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

这不是一个错误,而是一个警告,它似乎是因为默认启用了
-Wc++98 compat
而产生的。尝试将
-Wno-c++98 compat
添加到编译器选项中以禁用该类警告。根据基于范围的for循环应该在3.0中得到支持,我认为应该在XCode 4.2中安装onwards@JoachimIsaksson,我打赌它会包含在
-Weverything
中,而不是默认情况下打开。@chris是的,我证实了这一点,当我第一次阅读它时,我错过了
-Weverything
,现在编辑它已经太晚了:)