GCC 4.8 fails to covert lvalue during RVO optimization

This commit is contained in:
Abdullah Tahiri
2019-02-26 19:30:20 +01:00
committed by wmayer
parent a301145264
commit 3b4cfcff17

View File

@@ -81,9 +81,20 @@ std::unique_ptr<Part::GeometryExtension> GeometryDefaultExtension<T>::copy(void)
cpy->value = this->value;
cpy->setName(this->getName());
return cpy;
return std::move(cpy);
// Advise from Scott Meyers Effective Modern c++:
//
// Don't std::move(cpy); RVO optimization Item 25, if the compiler fails to elide, would have to move it anyway
// move constructor is executed if available (it is). Unique_ptr does not have copy constructor.
//
// That would work perfectly with GCC 7.3.0. However, GCC 4.8.4 misserably fails:
//
// /home/travis/build/FreeCAD/FreeCAD/src/Mod/Part/App/GeometryDefaultExtension.cpp: In instantiation of
// std::unique_ptr<Part::GeometryExtension> Part::GeometryDefaultExtension<T>::copy() const [with T = long int]:
// /home/travis/build/FreeCAD/FreeCAD/src/Mod/Part/App/GeometryDefaultExtension.cpp:164:16: required from here
// /home/travis/build/FreeCAD/FreeCAD/src/Mod/Part/App/GeometryDefaultExtension.cpp:84:12: error: cannot bind //
// std::unique_ptr<Part::GeometryDefaultExtension<long int>, std::default_delete<Part::GeometryDefaultExtension<long int> > > lvalue
// to std::unique_ptr<Part::GeometryDefaultExtension<long int>, std::default_delete<Part::GeometryDefaultExtension<long int> > >&&
}
template <typename T>