> 백엔드 개발 > C++ > C에서 클래스 유형의 Rvalue를 할당할 수 있습니까?

C에서 클래스 유형의 Rvalue를 할당할 수 있습니까?

DDD
풀어 주다: 2024-10-28 09:26:29
원래의
738명이 탐색했습니다.

 Can You Assign to an Rvalue of Class Type in C  ?

클래스 유형 Rvalue에 할당

개요

C 프로그래밍 언어에서 rvalue(오른쪽 값)는 일반적으로 lvalue( 왼쪽 값). 그러나 다음 코드에 설명된 것처럼 이 규칙에는 예외가 있습니다.

<code class="cpp">class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}</code>
로그인 후 복사

놀랍게도 이 코드는 생성자 Y(1)에서 반환된 개체가 rvalue임에도 불구하고 성공적으로 컴파일됩니다. 이 문서에서는 이러한 예상치 못한 동작의 이유를 살펴봅니다.

클래스 유형 R값에 할당

이 코드가 유효한 이유를 이해하는 열쇠는 합성된 멤버 함수의 개념에 있습니다. 할당 연산자를 명시적으로 정의하지 않는 클래스의 경우 컴파일러는 기본 할당 연산자를 생성합니다. 이 기본 연산자는 매개변수와 동일한 클래스의 객체에 대한 참조를 취하는 멤버 함수입니다.

위 예에서 클래스 Y에 대한 할당 연산자는 다음과 같이 합성됩니다.

<code class="cpp">Y& Y::operator=(const Y& other);</code>
로그인 후 복사

특히 이 합성 할당 연산자는 상수 멤버가 아닌 함수입니다. 즉, lvalue(참조된 객체)와 rvalue(참조되지 않은 객체) 모두에 적용할 수 있습니다.

생성자 반환 값

rvalue를 반환하는 생성자를 사용하여 객체를 생성할 때, 컴파일러는 메모리에 임시 개체를 생성합니다. 이 임시 개체는 생성된 문의 끝에서 자동으로 삭제됩니다. 그러나 생성자가 클래스 유형의 rvalue를 반환하는 경우 합성 할당 연산자는 임시 객체의 수명을 연장할 수 있습니다.

할당 구문

할당문 Y(1) = Y(0);

<code class="cpp">Y(1).operator=(Y(0));</code>
로그인 후 복사

우리가 확립한 대로 클래스 Y의 합성 할당 연산자인 Operator=는 상수가 아닌 멤버 함수입니다. 즉, rvalue에 적용할 수 있습니다. 따라서 컴파일러는 할당문을 생성자 Y(1)에 의해 생성된 임시 개체에 대한 할당으로 해석할 수 있습니다.

결론

일반적으로 예상되는 것과는 달리 할당이 가능합니다. 컴파일러가 명시적으로 정의된 할당 연산자 없이 클래스에 대해 비상수 할당 연산자를 합성하기 때문에 C에서 클래스 유형의 rvalue로 변환됩니다. 이러한 합성 할당 연산자는 생성자가 만든 임시 개체의 수명을 연장하여 rvalue에 대한 할당을 허용합니다.

위 내용은 C에서 클래스 유형의 Rvalue를 할당할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿