간단한 시뿔뿔 문제

76.***.207.158

한단계 높여서, 다음의 예의 경우는 더 흥미롭군요.

테스트 5:
#include<iostream>
using namespace std;

class Test
{
public:
Test(Test &t) { }
Test() { }
};

Test hi()
{
cout << “hi() Called\n”;
Test t;
return t;
}

int main()
{
Test t1;
Test t2 = hi();
t1 = hi();
return 0;
}

테스트 6:
#include<iostream>
using namespace std;

class Test
{
public:
Test(Test &t) { }
Test() { }
};

Test& hi()
{
cout << “hi() Called\n”;
Test t;
return t;
}

int main()
{
Test t1;
Test t2 = hi();
t1 = hi();
return 0;
}

이경우는 테스트5번은 컴파일 에러가 나고 테스트 6번은 실행됩니다. Test& hi() 에 &가 있느냐 없느냐의 차이인데, 원글의 테스트와는 달리 &가 있어야 실행되고 없으면 에러가 나는 케이스입니다. 와, 진짜 제대로 이해를 하지 못하면 상당히 헷갈릴수밖에 없지요? 이 경우는 아마 디폴트 컨스트럭터와 카피컨스트럭터의 미묘한 차이가 이런 결과를 만들어 내는거 같네요. 테스트6의 경우 함수반환값으로 템포러리 오브젝트 레퍼런스가 리턴되는데 이게 카피 컨스트럭터에서 lvalue 와 rvalue 가 둘다 Test& 라서 카피가 문제없이 실행 되었을까? 와, 헷갈린다.

물론 두 테스트 모두 Test(const Test &t){ } 라고 해주면 모두 에러없이 실행된다.