#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;
答案 0 :(得分:6)
在形成良好的意义上它是正确的,因此它编译。名称的范围在声明后立即开始,因此变量名称可以在其自己的初始化程序中使用。
使用未初始化的对象值来确定未定义的行为是不正确的。