C 11에서 아래 코드 조각은 유효합니다.
struct Cat { Cat(){} }; const Cat cat; std::move(cat);
이것은 const 개체를 이동하면 해당 상태가 변경된다는 의미이므로 동작이 직관에 반하는 것처럼 보일 수 있습니다. 그러나 std::move는 실제로 어떤 이동도 수행하지 않는다는 점을 이해하는 것이 중요합니다.
const 객체에서 std::move를 호출하면 컴파일러는 단순히 객체를 이동하려고 시도합니다. 클래스에 const 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); }
이 코드를 실행하면 복사 생성자가 대신 사용되었음을 나타내는 "COPY"가 인쇄됩니다. 이동 생성자의 이는 std::move가 const 개체를 수정하지 않음을 확인합니다.
const 개체 이동이 본질적으로 잘못된 것은 아니지만 개체가 다음과 같은 경우 성능 문제가 발생할 수 있습니다. 이동 생성자가 있습니다. 이러한 경우 불필요하게 복사본이 생성됩니다. 또한 객체 이동과 관련된 문제를 디버그하기가 더 어려워질 수 있습니다.
std::move는 객체를 이동하려는 시도로 구현되므로 const 객체에 사용할 수 있습니다. 실제 움직임보다는 이 동작은 const 개체의 계약을 위반하지 않으며 코드 설계에 더 큰 유연성을 허용합니다. 그러나 이 관행으로 인해 발생할 수 있는 잠재적인 성능 영향과 디버깅 문제를 인식하는 것이 중요합니다.
위 내용은 C의 `const` 객체에서 `std::move`가 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!