>  기사  >  백엔드 개발  >  클래스 유형의 Rvalue 참조에 할당할 수 있습니까? 역설이 설명되었습니다.

클래스 유형의 Rvalue 참조에 할당할 수 있습니까? 역설이 설명되었습니다.

Susan Sarandon
Susan Sarandon원래의
2024-11-01 17:44:02359검색

 Can You Assign to Rvalue References of Class Type?  A Paradox Explained.

클래스 유형의 Rvalue 참조 할당: A Paradox Resolved

C 영역에서는 lvalue와 rvalue의 구별이 가장 중요합니다. Lvalue는 수정할 수 있는 메모리 위치가 있는 개체를 나타내고, rvalue는 수정할 수 없는 임시 개체나 상수를 구현합니다. 그러나 흥미로운 코드 조각은 이러한 근본적인 구분에 대한 질문을 제기합니다.

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

int main() {
    Y(1) = Y(0); // Here lies the enigma!
    return 0;
}</code>

이 코드는 왜 컴파일됩니까? 생성자가 반환한 rvalue는 임시적이므로 할당에 적합하지 않습니까?

이 역설을 이해하는 열쇠는 C의 암시적 할당 연산자에 있습니다. 클래스에 대해 할당 연산자가 명시적으로 정의되지 않은 경우 컴파일러는 기본 할당 연산자를 합성합니다. 결정적으로, 이 합성 연산자는 어떤 경우에는 rvalue에 적용될 수 있습니다.

이때 명시적 키워드가 역할을 합니다. 주어진 예에서 Y 클래스는 할당 연산자를 선언하지 않으므로 컴파일러가 할당 연산자를 생성합니다. 명시적 키워드는 rvalue에서 암시적 변환을 방지하지만 합성 할당 연산자가 rvalue에 적용되는 것을 방지하지는 않습니다.

따라서 우리 코드에서 합성 할당 연산자는 다음과 같습니다.

<code class="cpp">Y& Y::operator=(Y const&);</code>

또는

<code class="cpp">Y& Y::operator=(Y&);</code>

왼쪽에 r값 Y(1)을 사용하여 호출할 수 있습니다. 이를 통해 Y(1)이 rvalue인 경우에도 할당을 진행할 수 있습니다.

임시 개체에 대한 할당을 방지하려면 참조 한정자(&)를 사용하여 할당 연산자를 명시적으로 선언할 수 있습니다.

<code class="cpp">class Y {
public:
    explicit Y(std::size_t num = 0);
    Y& operator=(Y const&) & = default;
};</code>

이 경우 할당 연산자가 합성되지 않으며 rvalue에 할당하려고 하면 컴파일 오류가 발생합니다.

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

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