"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 클래스 유형의 Rvalue 참조에 할당할 수 있습니까? 역설이 설명되었습니다.

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

2024-11-08에 게시됨
검색:534

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

클래스 유형의 Rvalue 참조 할당: 역설 해결

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

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

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

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

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

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

따라서 우리 코드에서 합성 할당 연산자:

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

또는

Y& Y::operator=(Y&);

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

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

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

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

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3