인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김상현님의 프로필 이미지
김상현

작성한 질문수

C개발자를 위한 최소한의 C++

임시 객체와 보이지 않는 복사 생성

일반 참조형과 const 참조형에 따라 컴파일 오류가 발생하거나 발생하지 않는 이유가 궁금합니다.

해결된 질문

작성

·

410

0

안녕하세요. 강의 잘 보고 있습니다.

강의 내용 중 하나 이해 안되는 것이 있어 질문 남깁니다.

// 위 코드 생략
TestData testFunc(TestData& rhs)
{
// 생략
}

int main()
{
    TestData result = testFunc( 10 );
    // 생략
} 

testFunc의 매개변수로 10이 넘어갔기 때문에 묵시적으로 변환 생성자 TestData(int)가 호출된 것으로 보입니다.

따라서 testFunc은 생성된 TestData를 참조로 받고 있는 것 같은데, 왜 위처럼 코드를 작성하면 오류가 발생하는지 이해가 되지 않습니다.

// 위 코드 생략
TestData testFunc(const TestData& rhs)
{
// 생략
}

int main()
{
    TestData result = testFunc( 10 );
    // 생략
} 

위처럼 const 키워드를 붙였을 땐 오류가 안 발생하는데 이유가 무엇인가요?

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

이유는 간단합니다. 상수 10의 자료형은 const int로 봐야 하기 때문입니다. 같은 예로 "Hello" 문자열의 자료형은 char[6]이 아니라 const char[6] 입니다. 올려준 예제를 컴파일 해보면 error C2664가 발생합니다. 이에 대한 MSDN의 자료를 보면 더 자세한 정보를 얻을 수 있습니다.

https://learn.microsoft.com/ko-kr/cpp/error-messages/compiler-errors-2/compiler-error-c2664?view=msvc-170

C++의 표준 문법은 계속 변화해왔습니다. 그리고 Visual Studo 2022 Community가 기본으로 적용하는 표준은 C++14입니다. 소위 모던 C++를 기본으로 채택하고 있는 것입니다. 같은 예제를 C++10을 기본으로 채택하고 있는 Visual Studio 2013으로 컴파일 할 경우 오류가 발생하지 않습니다. 즉, 모두 표준 문법에 따른 것입니다. 참고하시기 바랍니다.

0

안녕하세요, 인프런 AI 인턴입니다.

강의를 듣는 도중 일반 참조형과 const 참조형의 매개변수를 가지는 함수에서 컴파일 오류가 발생하는 경우에 대해 질문하신 김상현님, 참조형 매개변수에 관련된 질문이라면, 이미 답변된 유사한 질문이 있을 수 있어 아래의 링크를 참고하시면 좋을 것 같습니다. 이 링크에서는 const 참조와 일반 참조의 차이점과 사용 상의 주의점에 대해 설명하고 있습니다. 링크를 클릭하여 자세한 내용을 확인해보세요.

답변이 도움이 되었다면 좋겠습니다. 감사합니다.

김상현님의 프로필 이미지
김상현

작성한 질문수

질문하기