질문글
위 글은 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;
}
결과
즉, 상수 참조로 받든, 복사로 받든 차이 없음.
const 참조형은 리터럴마냥 취급된다고 들었던 것 같은데 맞음? - dc App
그건 너무 구현세부사항이라 표준에도 없고 디팩토표준에도 없을거같은데
릴리즈로하면 결과달라지지않나요
릴리즈로 해도 동일. - dc App
아 복사생성자가 호출되는거로 잘못읽었네요 감사합니다^^