2014-03-07 46 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

相关问题