std::Move를 상수 객체에 사용할 수 있는 이유
일반적으로 상수 객체에 std::move를 호출하는 것은 비논리적으로 보일 것입니다. 객체를 이동하거나 수정하려고 합니다. 그러나 C 11에서는 상수 개체에 대한 std::move 사용이 허용됩니다.
정확히 설명하자면 std::move(cat)는 개체가 실제로 이동되었음을 의미하지 않습니다. 대신 컴파일러에게 이동을 시도하도록 지시합니다. 클래스가 rvalue에 대한 const 참조(예: const Cat&&)를 허용하는 생성자를 정의하지 않는 경우 컴파일러는 lvalue 복사 생성자에 대한 암시적 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); }
std::move를 사용하더라도 "COPY" 메시지가 출력되어 다음을 나타냅니다. 개체가 이동되지 않고 복사되었습니다.
이 동작은 안전 메커니즘 역할을 합니다. 복사 생성자가 비활성화되면 컴파일러는 개발자에게 오류 메시지를 표시합니다.
게다가 Scott Meyers의 책 'Effective Modern C'에서 언급된 버그는 안정성 문제가 아니라 성능 문제입니다. 이동을 의도할 때 암시적 복사가 수행되어 실행 속도가 느려지는 경우에 발생합니다. 또한 이동 생성자가 없는 비상수 객체에서도 이러한 버그가 발생할 수 있습니다.
궁극적으로 std::move가 상수 객체에 대해 작동하도록 허용하면 유연성이 제공됩니다. 개발자는 원하는 경우 const rvalue 참조에서 명시적으로 개체를 구성할 수 있는 기능을 보유합니다.
위 내용은 C의 상수 개체에 `std::move`를 사용할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!