2013-07-03 43 views
9

我基本上有兩個問題,可能它們是相關的,所以我會把它們合併成一個。Enum class C++ 11通過引用或值

當傳遞到函數時,我們應該通過引用或值傳遞C++ 11中的枚舉類。它是繼承原始類型的,但它是通過的整個對象嗎?因爲枚舉類是安全的;

enum class MyEnumClass : unsigned short { 
    Flag1 = 0, 
    Flag2 = 1, 
    Flag3 = 2, 
    Flag4 = 4, 
}; 

現在讓我們說我們有功能SIG

const char* findVal(const MyEnumClass& enumClass); 
            ^
    should this be by const ref? __| 

我的其他問題就在這裏 -

SHOULD IT BE BY MOVE like (MyEnumClass&&) - I am still learning/understanding 
move semantics and rvalue so I am not sure if move semantics are only for 
constructors or can be for member or static funcs - 

回答

4

它不是繼承的基本類型,而是它告訴使用實施指定類型(unsigned short)作爲枚舉數的基礎類型。

您可以簡單地將枚舉類對象視爲任何其他類對象,並在將其傳遞給函數時應用相同的規則。

  • 如果要修改函數內部的枚舉類對象,請通過引用傳遞它。
  • 如果您只是想讀取函數內部的對象,請通過常量引用來傳遞它。

移動語義是語言運行時性能增強功能,它利用的機會來擺脫右值,而不是採用複製語義它們是性能密集型。 r值引用和移動語義不僅限於移動構造函數和移動賦值運算符,還可以與其他函數一起使用。如果您有可以利用這種優化的場景,那麼使用它們就完全沒問題。

+3

可能值得指出的是,在這種情況下,沒有什麼可以從移動中獲得。 – juanchopanza

+0

@juanchopanza:確實如此,正好指出。謝謝! –

3

考慮到枚舉器使用指定類型unsigned short作爲基礎類型,正如Alok Save指出的那樣,根據值傳遞這些對象可能是一個好主意(除非您想在函數中將它們的值更改爲邊效果,在這種情況下你應該使用一個參考。)