C에서는 std::move 함수를 사용하여 객체의 소유권을 이전합니다. 그러나 일반적인 질문이 생깁니다. 왜 const 객체에서 std::move를 호출하는 것이 가능합니까? 이는 직관에 어긋나고 잠재적으로 위험하지 않습니까?
비결은 std::move(const_object)가 실제 이동을 수행하지 않는다는 사실에 있습니다. 대신 컴파일러에게 이동을 시도하도록 지시합니다. 클래스에 rvalue(이동 생성자)에 대한 const 참조를 허용하는 생성자가 없는 경우 컴파일러는 기본적으로 암시적 복사 생성자를 사용합니다.
다음 예를 고려하세요.
struct Cat { Cat(){} Cat(const Cat&) {std::cout << "COPY";} Cat(Cat&&) {std::cout << "MOVE";} }; int main() { const Cat cat; Cat cat2 = std::move(cat); // prints "COPY" }
보시다시피 cat이 const 객체임에도 불구하고 컴파일러는 안전하게 cat2를 복사본으로 생성합니다. 이는 이 예에서는 const 객체에 사용할 수 있는 이동 생성자가 없기 때문입니다.
Scott Meyers가 "Effective Modern C"에서 강조한 잠재적 함정은 안정성 문제라기보다는 성능 문제입니다. 본질적으로 이동 생성자를 사용할 수 없을 때 const 객체에서 이동을 시도하면 복사 효율성이 떨어집니다.
std::move가 const 객체에서 작동하지 않도록 제한하는 것이 논리적으로 보일 수도 있지만, 다음과 같은 이유로 인해 간단한 해결책은 아닙니다.
위 내용은 C의 Const 객체에서 이동할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!