clang中是否有一组已知的`c ++ 11`功能,默认情况下不需要`-std = c ++ 11`?

卡特斯克尔

似乎clang(3.4)自动接受某些c ++ 11(例如auto,for(:))而没有特殊标志(尽管会产生警告),但不接受其他部分(例如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以及为什么要支持的任何特定文档有人知道吗?

斯蒂芬·韦瑟(Stefan Weiser)

Clang具有(与任何其他C ++编译器一样)一些语言扩展(有一系列C ++ 11扩展,在C ++ 03中可用)。此扩展之一是基于范围的for循环。您可以通过进行测试#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;
}

奇怪的是,这警告说类型推断扩展名和功能已关闭,但是它有效地编译了自动指针(我想这是由于autoas存储类说明符的旧含义):

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章