질문글

24b0d121e09c28a8699fe8b115ef046f58489d9f


위 글은 RVO에 대한 이야기와 함께 반환 값을 참조로 받느냐 복사로 받느냐에 따라, 

어떤 종류의 생성자가 호출되는지 물어보고 있음.


나도 헷갈려서 직접 테스트 해봄.


환경: MSVC, C++14, DEBUG 모드

테스트코드


#include <iostream>

class Widget
{
public:
Widget()
: mVal(5)
{
std::cout << "생성자 호출" << '\n';
}

Widget(const Widget& copy)
{
this->mVal = copy.mVal;
std::cout << "복사 생성자 호출" << '\n';
}

Widget(Widget&& move)
{
this->mVal = move.mVal;
std::cout << "이동 생성자 호출" << '\n';
}

void setVal(int val)
{
this->mVal = val;
}

void printVal()
{
std::cout << this->mVal << '\n';
}

private:
int mVal;
};

Widget func()
{
return Widget();
}

int main()
{
Widget w1 = func();
w1.setVal(10);
w1.printVal();

const Widget& w2 = func();

return 0;
}

결과

24b0d121e09c28a8699fe8b115ef046c67f321


즉, 상수 참조로 받든, 복사로 받든 차이 없음.