클래스 유형의 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