diff --git a/src/Mod/Part/App/GeometryDefaultExtension.cpp b/src/Mod/Part/App/GeometryDefaultExtension.cpp index 20c5ac2bfd..bc0ba91996 100644 --- a/src/Mod/Part/App/GeometryDefaultExtension.cpp +++ b/src/Mod/Part/App/GeometryDefaultExtension.cpp @@ -81,9 +81,20 @@ std::unique_ptr GeometryDefaultExtension::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::GeometryDefaultExtension::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, std::default_delete > >’ lvalue + // to ‘std::unique_ptr, std::default_delete > >&&’ } template