2011-06-27 2 views
11

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

#ifdef RVALUE_REFERENCES_SUPPORTED 

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

#endif 

ответ

15

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

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

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

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

+0

Большое спасибо :) – fredoverflow

+4

Должен признаться, что мне очень нравится, как Кланг решил рекламировать свои различные функции и расширения, он намного яснее, чем проверка номера версии и многое другое. –

5

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

Смежные вопросы