Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct Base
- {
- Base() = default;
- Base(const Base&)
- {
- }
- Base(Base&&)
- {
- }
- };
- struct Derived : Base
- {
- };
- Base foo()
- {
- Derived derived;
- return derived;
- }
- int main()
- {
- }
- prog.cc:21:10: warning: local variable 'derived' will be copied despite being returned by name [-Wreturn-std-move]
- return derived;
- ^~~~~~~
- prog.cc:21:10: note: call 'std::move' explicitly to avoid copying
- return derived;
- ^~~~~~~
- std::move(derived)
- #include <iostream>
- #include <iomanip>
- struct Base
- {
- bool flag{false};
- Base()
- {
- std::cout << "Base construction" << std::endl;
- }
- Base(const bool flag) : flag{flag}
- {
- }
- Base(const Base&)
- {
- std::cout << "Base copy" << std::endl;
- }
- Base(Base&& otherBase)
- : flag{otherBase.flag}
- {
- std::cout << "Base move" << std::endl;
- otherBase.flag = false;
- }
- ~Base()
- {
- std::cout << "Base destruction" << std::endl;
- }
- };
- struct Derived : Base
- {
- Derived()
- {
- std::cout << "Derived construction" << std::endl;
- }
- Derived(const bool flag) : Base{flag}
- {
- }
- Derived(const Derived&):Base()
- {
- std::cout << "Derived copy" << std::endl;
- }
- Derived(Derived&&)
- {
- std::cout << "Derived move" << std::endl;
- }
- ~Derived()
- {
- std::cout << "Derived destruction" << std::endl;
- std::cout << "Flag: " << flag << std::endl;
- }
- };
- Base foo_copy()
- {
- std::cout << "foo_copy" << std::endl;
- Derived derived{true};
- return derived;
- }
- Base foo_move()
- {
- std::cout << "foo_move" << std::endl;
- Derived derived{true};
- return std::move(derived);
- }
- int main()
- {
- std::cout << std::boolalpha;
- (void)foo_copy();
- std::cout << std::endl;
- (void)foo_move();
- }
- foo_copy
- Base copy
- Derived destruction
- Flag: true
- Base destruction
- Base destruction
- foo_move
- Base move
- Derived destruction
- Flag: false
- Base destruction
- Base destruction
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement