내 이해는 C ++ 11에서 값으로 함수에서 로컬 변수를 반환 할 때 컴파일러가 해당 변수를 r 값 참조로 취급하고 반환 할 함수에서 '이동'할 수 있다는 것입니다. 물론 RVO / NRVO는 발생하지 않습니다).
내 질문은 이것이 기존 코드를 깨뜨릴 수 없다는 것입니다.
다음 코드를 고려하십시오.
#include <iostream>
#include <string>
struct bar
{
bar(const std::string& str) : _str(str) {}
bar(const bar&) = delete;
bar(bar&& other) : _str(std::move(other._str)) {other._str = "Stolen";}
void print() {std::cout << _str << std::endl;}
std::string _str;
};
struct foo
{
foo(bar& b) : _b(b) {}
~foo() {_b.print();}
bar& _b;
};
bar foobar()
{
bar b("Hello, World!");
foo f(b);
return std::move(b);
}
int main()
{
foobar();
return EXIT_SUCCESS;
}
내 생각은 로컬 객체의 소멸자가 암시 적으로 이동 된 객체를 참조 할 수 있으므로 예기치 않게 '빈'객체를 볼 수 있다고 생각했습니다. 나는 이것을 테스트하려고했지만 ( http://ideone.com/ZURoeT 참조 ),에 명시 적 인없이 '정확한'결과를 얻었 std::move
습니다 foobar()
. 나는 그것이 NRVO 때문이라고 생각하지만, 그것을 비활성화하기 위해 코드를 재 배열하려고하지 않았습니다.
이 변환 (함수를 벗어나게 함)이 암시 적으로 발생하고 기존 코드를 손상시킬 수 있다는 것이 맞습니까?
업데이트 여기 내가 말하는 것을 보여주는 예가 있습니다. 다음 두 링크는 동일한 코드에 대한 것입니다. http://ideone.com/4GFIRu-C ++ 03 http://ideone.com/FcL2Xj-C ++ 11
출력을 보면 다르게 보입니다.
따라서이 질문이 이제 표준으로 암시 적 이동을 추가 할 때 고려 되었습니까? 이런 종류의 코드가 드물기 때문에이 주요 변경 사항을 추가하는 것이 좋기로 결정되었습니다. 또한 이런 경우 컴파일러가 경고하는지 궁금합니다 ...