From 3b4cfcff17540d0942bd0a596998f2d9436b4d3b Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Tue, 26 Feb 2019 19:30:20 +0100 Subject: [PATCH] GCC 4.8 fails to covert lvalue during RVO optimization --- src/Mod/Part/App/GeometryDefaultExtension.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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