클래스 유형의 Rvalue에 할당이 가능한 이유는 무엇입니까?
C에서는 일반적으로 rvalue 표현식에 대한 할당을 수행할 수 없습니다. 그러나 이 동작은 아래 코드 조각에서 위반된 것으로 보입니다.
class Y { public : explicit Y(std::size_t num = 0) {} }; int main() { Y(1) = Y(0); // Assignment to rvalue return 0; }
설명:
초기 예상과 달리 이 코드는 성공적으로 컴파일됩니다. 그 이유는 멤버 함수, 특히 할당 연산자의 암시적 합성에 있습니다. C 표준(섹션 12.8 [class.copy], 단락 18)에 따르면 할당 연산자가 선언되지 않거나 삭제된 것으로 표시되면 컴파일러는 이를 합성합니다. 클래스 유형 Y의 경우 합성 할당 연산자에는 다음 서명이 있습니다.
이러한 서명에는 매개변수 앞에 참조 한정자(&)가 포함되지 않습니다. 따라서 합성 할당 연산자는 rvalue 표현식에 적용 가능합니다.
이 동작을 통해 생성자 Y(1)를 호출하여 생성된 임시 객체에 할당할 수 있습니다.
왼쪽 방지 -핸드 측 임시:
과제 왼쪽에 임시 개체가 생성되는 것을 방지하려면 "복사 제거"라는 기술을 사용할 수 있습니다. 여기에는 수정된 다음 코드와 같이 참조 한정자를 사용하여 할당 연산자를 선언하는 작업이 포함됩니다.
class Y { public : explicit Y(std::size_t num = 0); Y& operator= (Y const&) & = default; };
이 변경으로 인해 합성 할당 연산자는 더 이상 rvalue에 적용되지 않습니다.
위 내용은 C에서 클래스 유형의 Rvalue에 할당할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!