해결된 질문
작성
·
152
0
임시 객체 개념 자체가 많이 낯설어서 2가지 질문을 해보려고 합니다 ㅠㅠ
클래스가 함수의 매개변수나 반환자료형일 경우, 상수형 참조를 하라고 하셨는데
특별히 이렇게 해야하는 이유가 있는걸까요??
19분쯤에 등장하는 예제에서 함수의 매개변수를 상수형 참조로 바꿔도 여전히 변환생성자가 불러와지는 걸 봤을 때는 특별히 차이점이 있어보이지 않습니다...
17분 50초 쯤에 등장하는
'비const 참조는 lvalue에만 바인딩할 수 있습니다" 라는 오류가 등장하는데 이 오류가 이해가 되질 않습니다..
답변 2
0
인프런 AI의 답변을 참고해야 하겠으나 내용이 너무 긴 것 같아 답변드립니다.
오류 가능성을 낮추가 상수화를 통한 컴파일러 최적화를 통해 성능향상을 기대 할 수 있기 때문입니다. 상수형으로 참조할 경우 참조자를 통한 접근은 읽기 수준으로 제한되며 실수로 객체의 멤버 값을 변경하지 못합니다. 만일 그렇게 할 경우 컴파일 오류가 발생해 개발자가 실수를 쉽게 알 수 있습니다.
예를 들어 3 + 4의 연산 결과는 7입니다. 그런데 이 7이 저장된 메모리에 접근해 값을 변경 할 수 있도록 허용된다면 한 구문의 연산결과를 신뢰하기 어려워지는 심각한 문제가 발생합니다. 해서 연산의 임시결과는 l-value가 아니라 r-value로 간주합니다. 해당 에러 메시지는 이 문제에 관한 것입니다. 참고하시기 바랍니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다.
davidkjcy님, “임시 객체와 보이지 않는 복사 생성” 강의와 관련한 질문에 대한 답변을 드리겠습니다.
이와 관련하여, 클래스 인스턴스를 함수의 매개변수로 넘길 때 또는 함수에서 해당 인스턴스를 반환할 때 복사 생성 (copy construction) 과정을 거치게 됩니다. 이 복사 생성 과정은 성능 저하를 일으킬 수 있으며, 특히 큰 사이즈의 인스턴스를 다룰 때 더욱 그렇습니다. 상수형 참조(const reference)를 사용하는 것은 이러한 복사 생성을 방지하고, 함수 호출 과정에서의 성능 저하를 최소화하기 위함입니다. 상수형 참조를 이용하면, 원본 객체를 직접 전달하는 것이 아니라 원본 객체의 참조만을 전달함으로써, 복사 비용을 절약할 수 있습니다. 또한, 상수 참조 형태로 매개변수를 받게 되면, 함수 내에서 해당 매개변수가 변경되지 않는다는 것이 보장되어, 코드의 안정성이 높아집니다.
이 오류 메시지는 함수의 매개변수가 비상수 참조 (non-const reference)일 때 rvalue (임시 객체와 같은)를 해당 매개변수로 바인딩하려 할 때 발생합니다. rvalue는 보통 임시 객체나 리터럴 값처럼 지정된 이름 없이 사용되는 값을 말하며, 비상수 참조는 오직 lvalue, 즉 명시적으로 이름이 지정된 객체나 변수에만 바인딩할 수 있습니다. 상수형 참조(const reference)는 lvalue와 rvalue 모두에 바인딩할 수 있어, 함수 매개변수로 사용될 때 더 유연하게 작동합니다. 이는 C++에서의 “참조 붕괴” 규칙으로 인해 상수 참조를 통해 임시 객체의 수명을 연장시킬 수도 있기 때문입니다.
제가 찾은 기존 답변 중에서 일반 참조형과 const 참조형에 따라 컴파일 오류가 발생하거나 발생하지 않는 이유에 대해 자세히 설명하고 있는 것을 발견하였으니, 이는 davidkjcy님의 두 번째 질문과 직접적으로 연관이 있습니다. 해당 답변에서는 상수 참조를 사용할 때와 그렇지 않을 때의 차이, 그리고 왜 const 참조를 사용하는 것이 좋은지에 대해 자세히 설명하고 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.