>백엔드 개발 >C++ >C에서 클래스 유형의 Rvalue에 할당할 수 있는 이유는 무엇입니까?

C에서 클래스 유형의 Rvalue에 할당할 수 있는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-29 13:58:02951검색

 Why Can We Assign to Rvalues of Class Type in C  ?

클래스 유형의 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의 경우 합성 할당 연산자에는 다음 서명이 있습니다.

  • Y& Y::operator=(Y const&)
  • Y& Y::operator=(Y&)

이러한 서명에는 매개변수 앞에 참조 한정자(&)가 포함되지 않습니다. 따라서 합성 할당 연산자는 rvalue 표현식에 적용 가능합니다.

이 동작을 통해 생성자 Y(1)를 호출하여 생성된 임시 객체에 할당할 수 있습니다.

왼쪽 방지 -핸드 측 임시:

과제 왼쪽에 임시 개체가 생성되는 것을 방지하려면 "복사 제거"라는 기술을 사용할 수 있습니다. 여기에는 수정된 다음 코드와 같이 참조 한정자를 사용하여 할당 연산자를 선언하는 작업이 포함됩니다.

class Y {
public :
    explicit Y(std::size_t num = 0);
    Y& operator= (Y const&) & = default;
};

이 변경으로 인해 합성 할당 연산자는 더 이상 rvalue에 적용되지 않습니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.