클래스 메소드와 필드에 나중에 액세스 :표준 :의 이동 *이 나는이 코드를 할 바보 같은 이해 ...하지만 이해를 위해, 다음을 고려하십시오
#include <iostream>
#include <memory>
#include <utility>
struct S;
void f(S && s);
struct S {
S() : i{std::vector<int>(10, 42)} {}
std::vector<int> i;
void call_f() { f(std::move(*this)); }
void read() { std::cout << " from S: " << i.at(3) << std::endl; }
};
void f(S && s) { std::cout << " from f: " << s.i.at(3) << std::endl; }
int main() {
S s;
s.call_f();
s.read();
}
을 이 컴파일 및 g ++ 및 clang ++, 나는 std::vector<int>
이동할 것으로 예상되는 동안 실행합니다. gdb에서 이것을 실행하고 메모리를 보면 의 주소는 std::move
이후에 0으로 설정되지 않았지만, POD가 아닌 유형의 경우에는 0으로 설정됩니다. 따라서이 코드 조각에서 segfault가 예상됩니다.
누구든지이 동작을 설명해 주시겠습니까? s
도 내부 필드도 무효화되지 않는 이유는 무엇입니까? this
의 기능입니까?
결코 세그 폴트를 "예상"하지 마십시오! 비록 당신이 (당신이하지 않은) 원인이 될 수있는 코드를 작성해도, 그 코드를 기대하는 것은 어리 석다. –
std :: move (* this)는 아무 것도 움직이지 않으며, f의 이동 오버로드를 호출해도 괜찮음을 컴파일러에 알립니다. f의 이동 오버로드를 구현해도 s가 엉망이되지 않으면 인스턴스가 여전히 양호합니다. segfault를 원하면 f의 내부에서 s.i를 효과적으로 움직이는 무언가를 추가해야합니다. – rectummelancolique
@rectummelancolique : 안녕하세요. 이것은 코멘트 섹션입니다. ↓↓↓↓↓ 답변을 게시판 게시판과는 별도로 SE Q & A를 설정하는 동료 검토 기능의 적용을받을 수 있도록 아래쪽에 놓으십시오. 감사! –