2011-06-27 18 views
11

Jak mogę sprawdzić, czy mój kompilator obsługuje odniesienia rvalue, czy nie? Czy istnieje standardowe makro preprocesora, czy też różne kompilatory mają różne makra? Idealnie, chciałbym napisać to:Kompilacja warunkowa dla operacji przenoszenia

#ifdef RVALUE_REFERENCES_SUPPORTED 

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

#endif 

Odpowiedz

15

nie jestem świadomy każdej standardowej preprocesora makro, ale:

  • Visual Studio wprowadzono wsparcie w VC2010, którego wewnętrzna wersja 1600, więc można skontaktować się z _MSC_VER >= 1600
  • GCC wspiera referencje rvalue od version 4.3, więc można sprawdzić na tej wersji wraz z __GXX_EXPERIMENTAL_CXX0X__
  • Clang definiuje __has_featuremacros dla robiąc dokładnie to, czego potrzebujesz: __has_feature(cxx_rvalue_references)

Tak więc dla najbardziej popularnych kompilatorów, powinno być dość łatwo spleść coś razem.

Jestem też pewien, że doładowania ma makro do tego celu, który może być w stanie wykorzystać, jeśli projekt zawiera podwyższający (inaczej można spojrzeć na ich realizację)

+0

dziękuję bardzo :) – fredoverflow

+4

Muszę przyznać, że naprawdę uwielbiam sposób, w jaki Clang zdecydował się reklamować swoje różne funkcje i rozszerzenia, jest o wiele jaśniejszy niż sprawdzanie z numerem wersji i dużo bardziej szczegółowy. –

5

Standardową metodą jest sprawdzenie wersja standardowa: Jeśli __cplusplus==199711L to nie masz (standardowych) referencji rvalue. Jeśli robisz to __cplusplus==201103L. Oczywiście nie obejmuje to nietypowych kompilatorów ani niestandardowych rozszerzeń C++ 98.