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

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

#ifdef RVALUE_REFERENCES_SUPPORTED

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

#endif

Ответ 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.