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임에도 불구하고 성공적으로 컴파일됩니다. 이 문서에서는 이러한 예상치 못한 동작의 이유를 살펴봅니다.
이 코드가 유효한 이유를 이해하는 열쇠는 합성된 멤버 함수의 개념에 있습니다. 할당 연산자를 명시적으로 정의하지 않는 클래스의 경우 컴파일러는 기본 할당 연산자를 생성합니다. 이 기본 연산자는 매개변수와 동일한 클래스의 객체에 대한 참조를 취하는 멤버 함수입니다.
위 예에서 클래스 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!