是否在clang中启用了一组已知的`c ++ 11`功能,不需要`-std = c ++ 11`?

时间:2014-07-01 15:20:37

标签: c++ c++11 clang

看来clang(3.4)会自动接受一些c ++ 11(例如auto,for(:))而没有特殊标志(虽然会产生警告),但不是其他部分(< em>例如lambdas )。

例如,以下编译clang++ c++11.success.cpp

#include <vector>
int main( int argCount, char ** argVec )
{
    std::vector<int> vec;

    for( auto & item : vec )
    {
        ++item;
    }    

    return 0;
}

但这失败了clang++ c++11.failure.cpp

#include <vector>
int main( int argCount, char ** argVec )
{
    std::vector<int> vec;
    auto lambda = [] ( int & foo ) { return ++foo; }; //This line fails at []

    for( auto & item : vec )
    {
        lambda( item );
    }

    return 0;
}

当然clang++ c++11.failure.cpp -std=c++11成功。

我无法找到任何特定文档,说明在没有c++11的情况下支持哪些-std=c++11功能以及原因。任何人都有线索?

1 个答案:

答案 0 :(得分:3)

Clang(和任何其他C ++编译器一样)有些language extensions(有一个C ++ 11扩展列表,可以在C ++ 03中找到)。其中一个扩展是基于循环的范围。您可以按#if __has_extension(cxx_range_for) ...进行测试。无论如何它都会生成警告(如果你没有用-Wno-c++11-extensions禁用它)。您可以使用以下方法测试功能:

#if __has_extension(cxx_range_for)
#warning __has_extension(cxx_range_for) is true
#else
#warning __has_extension(cxx_range_for) is false
#endif

#if __has_feature(cxx_range_for)
#warning __has_feature(cxx_range_for) is true
#else
#warning __has_feature(cxx_range_for) is false
#endif

#if __has_extension(cxx_auto_type)
#warning __has_extension(cxx_auto_type) is true
#else
#warning __has_extension(cxx_auto_type) is false
#endif

#if __has_feature(cxx_auto_type)
#warning __has_feature(cxx_auto_type) is true
#else
#warning __has_feature(cxx_auto_type) is false
#endif

int main()
{
        return 0;
}

奇怪的是,这会警告,类型推断扩展和功能已关闭,但它有效地编译自动指针(我猜,这是因为auto作为存储类说明符的旧含义):

main.cpp:2:2: warning: __has_extension(cxx_range_for) is true [-W#warnings]
#warning __has_extension(cxx_range_for) is true
 ^
main.cpp:10:2: warning: __has_feature(cxx_range_for) is false [-W#warnings]
#warning __has_feature(cxx_range_for) is false
 ^
main.cpp:16:2: warning: __has_extension(cxx_auto_type) is false [-W#warnings]
#warning __has_extension(cxx_auto_type) is false
 ^
main.cpp:22:2: warning: __has_feature(cxx_auto_type) is false [-W#warnings]
#warning __has_feature(cxx_auto_type) is false
 ^

要获得完全符合标准,您应该通过启用-Werror将警告视为错误。