> 백엔드 개발 > C++ > 본문

Rvalue에 할당: 금지됨 또는 기능? 반환 값을 할당할 수 있는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-10-31 09:19:30
원래의
400명이 탐색했습니다.

 Assignment to Rvalues: Forbidden or Feature? Why Can We Assign to a Return Value?

Rvalue 할당: 왜, 어떻게?

클래스 유형의 반환 값(rvalue)에 할당이 가능한 이유는 무엇입니까? 일반적으로 rvalue는 메모리 주소가 없는 임시 항목으로 간주됩니다. 그러면 어떻게 왼쪽 값(lvalues)으로 사용할 수 있습니까?

다음의 난해한 코드를 생각해 보세요.

class Y {
public :
    explicit Y(size_t num = 0) {}
};

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

이 코드는 비논리적으로 보일 수도 있지만 오류 없이 컴파일됩니다. 그 이유를 이해하려면 할당 연산자 이면의 메커니즘을 자세히 조사해야 합니다.

합성 할당 연산자

클래스가 할당 연산자를 명시적으로 정의하지 않으면 컴파일러는 자동으로 하나를 생성합니다. 합성 연산자는 다음 두 가지 형식 중 하나를 취할 수 있습니다.

  • Y& 연산자=(Y const&)
  • Y& 연산자=(Y&)()

후자의 형식은 rvalue에 적용되기 때문에 주목할 만합니다. 따라서 위의 예에서 컴파일러는 생성자 Y(1)에서 반환된 rvalue를 허용할 수 있는 할당 연산자를 생성합니다.

Rvalue에 대한 할당 방지

If rvalue에 대한 할당을 금지하려면 ref-qualifier를 사용하여 할당 연산자를 명시적으로 선언하면 됩니다. 이런 방식으로 연산자가 lvalue만 허용하도록 제한할 수 있습니다. 예를 들면 다음과 같습니다.

class Y {
public :
    explicit Y(std::size_t num = 0);
    Y& operator=(Y const&) & = default;
};
로그인 후 복사

ref 한정자 &를 사용하면 합성 할당 연산자가 lvalue에만 사용 가능하도록 할 수 있습니다.

위 내용은 Rvalue에 할당: 금지됨 또는 기능? 반환 값을 할당할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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