Условная компиляция для операций перемещения - PullRequest
11 голосов
/ 27 июня 2011

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

#ifdef RVALUE_REFERENCES_SUPPORTED

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

#endif

Ответы [ 3 ]

15 голосов
/ 27 июня 2011

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

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

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

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

9 голосов
/ 27 июня 2011

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

5 голосов
/ 27 июня 2011

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

...