2011-06-27 41 views
11

如何檢查我的編譯器是否支持右值引用?是否有標準的預處理器宏,或者不同的編譯器有不同的宏?理想情況下,我希望寫這篇文章:移動操作的條件編譯

#ifdef RVALUE_REFERENCES_SUPPORTED 

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

#endif 

回答

15

我不知道任何標準預處理宏,但:

  • Visual Studio的推出在VC2010支持,其內部版本是1600,那麼你可以_MSC_VER >= 1600
  • GCC檢查,因爲version 4.3一直支持右值引用,這樣你就可以__GXX_EXPERIMENTAL_CXX0X__
  • 鏘一起檢查該版本定義了__has_featuremacros做你需要的東西:__has_feature(cxx_rvalue_references)

所以對於大多數常見的編譯器來說,應該很容易就可以自己拼湊一些東西。

我也敢肯定,加速了這個目的,你可以使用,如果你的項目包括升壓(否則你可以看看他們的實現)

+0

非常感謝:) – fredoverflow

+4

我必須承認,我真的很喜歡Clang選擇宣傳其各種功能和擴展的方式,它比檢查版本號更清晰,也更詳細。 –

5

的標準方法是檢查宏標準版本:如果__cplusplus==199711L那麼你沒有(標準)右值引用。如果__cplusplus==201103L,你這樣做。顯然,這不包括非標準的編譯器或C++ 98的非標準擴展。