예:
Foo return_a_foo()
{
const auto a_foo = make_a_foo();
//Work with, but do not mutate a_foo...
return a_foo;
}
컴파일러가 RVO를 사용할 수 없다면 적어도 a_foo를 시도하고 이동할 것으로 예상합니다. 그러나 a_foo는 const입니다 (하지만 여전히 범위를 벗어납니다). 표준의 어느 곳에서 이것이 움직이지 않는 것을 100 % 보장한다고 말합니까 (불만) 아니면 구현이 정의되어 있습니까?
값으로 반환 된 const 객체를 계속 이동할 수 있습니까?
어떤 사람들은 대답이 "가끔 그렇다"라는 것을 알고 충격을받을 것입니다.
그러나이를 활성화하려면 더 많은 생성자를 제공해야합니다. 멤버를 만들 mutable
거나 그렇지 않으면 const-move-construction을 수동으로 처리해야합니다.
증명:
#include <iostream>
#include <memory>
struct Foo
{
Foo() { std::cout << "default c'tor\n"; }
Foo(Foo const&&) { std::cout << "Foo const&&\n"; }
Foo(Foo &&) { std::cout << "Foo &&\n"; }
Foo(Foo const&) { std::cout << "Foo const&\n"; }
Foo(Foo &) { std::cout << "Foo &\n"; }
};
const Foo make_a_foo()
{
auto p = std::make_unique<const Foo>();
return std::move(*p);
}
const Foo return_a_foo()
{
const auto a_foo = make_a_foo();
//Work with, but do not mutate a_foo...
return a_foo;
}
int main()
{
auto f = return_a_foo();
}
예제 출력 :
default c'tor
Foo const&&
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다