Подтвердить что ты не робот

Есть ли известный набор функций `С++ 11` в clang по умолчанию, не требующий` -std = С++ 11`?

Похоже, что clang (3.4) автоматически принимает некоторый С++ 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 и почему. У кого-нибудь есть ключ?

4b9b3361

Ответ 1

Clang имеет (как и любой другой компилятор С++) некоторые языковые расширения (есть список расширений С++ 11, которые доступны в С++ 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.