2014-03-07 82 views
0

我試圖牢牢把握移動和複製構造函數和作業。爲什麼Visual Studio沒有進入我的賦值操作符?

我有以下簡單的模板類:

template<typename T> 
class Box { 

public: 
    // Copy constructor 
    explicit Box(const T& val) { 
     value = val; 
    } 

    // Move constructor 
    explicit Box(const T&& val) { 
     value = val; 
    } 

    // Set and get value 
    void set(T val) { value = val; } 
    T get() { return value; } 

    // Copy assignment operator 
    T& operator=(const T& val) { 
     value = val; 
    } 

    // Move assignment operator 
    T& operator=(const T&& val) { 
     value = val; 
    } 

private: 
    T value; 

}; 

這是使用下面的代碼:

int main() { 
    Box<int> iBox{ 1 }; 

    int j = 5; 
    Box<int> jBox{ j }; 

    iBox = jBox; 

    return 0; 
} 

我希望,如果我的代碼是正確的,當我踏進iBox = jBox ,我應該進入分配重載之一。爲什麼這不會發生?

+0

查找在調試選項中啓用「只是我的代碼」。或者,禁用優化 – sehe

+0

您是否禁用內聯以進行調試?如果沒有,該函數可能不會被調用,而是在適當的位置執行。 –

+0

@sehe,'工具|選項|調試|常規|啓用只是我的代碼'不起作用。 @king_nak,「項目屬性| C/C++ |優化|內聯函數擴展」沒有任何作用(假設我正在擺弄正確的選項...)並且優化已經關閉(在相同的地方)。 – Steve

回答

5

您還沒有聲明一個賦值運算符采用Box類型的右側操作數,因此編譯器沒有其他選擇,只能使用其生成的默認賦值運算符。

順便說一下,在您的賦值運算符中也沒有return聲明。

也許你的意思是寫:

Box& operator=(const Box& other) { 
    value = other.value; 
    return *this; 
} 

Box& operator=(Box&& val) { 
    value = other.value; 
    return *this; 
} 

注意右值參考const將毫無意義。

+0

是的,我只是注意到我的代碼中的這個缺陷。操作員應該爲這些類型使用「Box」而不是「T」... – Steve

相關問題