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

Условная компиляция для операций перемещения

Как проверить, поддерживает ли мой компилятор ссылки rvalue или нет? Есть ли стандартный макрос препроцессора или разные компиляторы имеют разные макросы? В идеале я хотел бы написать следующее:

#ifdef RVALUE_REFERENCES_SUPPORTED

foobar(foobar&& that)
{
    // ...
}

#endif
4b9b3361

Ответ 1

Я не знаю ни одного стандартного макроса препроцессора, но:

  • Visual Studio представила поддержку в VC2010, внутренняя версия которой 1600, поэтому вы можете проверить с помощью _MSC_VER >= 1600
  • GCC поддерживает ссылки rvalue с версия 4.3, поэтому вы можете проверить эту версию вместе с __GXX_EXPERIMENTAL_CXX0X__
  • Clang определяет __has_feature макросы для выполнения именно того, что вам нужно: __has_feature(cxx_rvalue_references)

Таким образом, для большинства распространенных компиляторов, должно быть довольно легко совместить что-то вместе.

Я также уверен, что у Boost есть макрос для этой цели, который вы можете использовать, если ваш проект включает Boost (иначе вы могли бы посмотреть на их реализацию)

Ответ 2

Boost.Config имеет BOOST_NO_RVALUE_REFERENCES для этого.

Ответ 3

Стандартный метод - проверить стандартную версию: Если __cplusplus==199711L, то у вас нет (стандартных) ссылок rvalue. Если __cplusplus==201103L, вы делаете. Очевидно, что это не распространяется на нестандартные компиляторы или нестандартные расширения на С++ 98.