这个C ++代码是否正确?

时间:2014-02-09 21:04:21

标签: c++

#include <iostream>

class My
{
public:
    My(int &val) : m_val(val)
    {
        std::cout << "int& constructor" << std::endl;
        Print();
    }
    My(const My& my) : m_val(my.m_val)
    {
        std::cout << "copy constructor" << std::endl;
        Print();
    }
    My &operator=(const My&)
    {
        std::cout << "operator =" << std::endl;
        Print();
        return *this;
    }

    void Print()
    {
        std::cout << "m_val ptr = " << &m_val << std::endl;
        std::cout << "m_val     = " << m_val  << std::endl;
    }

    int &m_val;
};

int main() {
    My my = my;
    return 0;
}

这个C ++代码是否正确?当这段代码在gcc和msvc上编译时,我感到很惊讶。

该计划的输出是:

  

复制构造函数

     

m_val ptr = 0xb74a36e5

     

m_val = 1528349827

upd:我关注这一行

My my = my; 

1 个答案:

答案 0 :(得分:6)

在形成良好的意义上它是正确的,因此它编译。名称的范围在声明后立即开始,因此变量名称可以在其自己的初始化程序中使用。

使用未初始化的对象值来确定未定义的行为是不正确的。