From 27952078025543c479110452a1ce5c30a799a480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Wed, 18 May 2022 12:15:43 +0200 Subject: [PATCH] No longer delete move constructor/assignment operator We follow the advice given by Josuttis in his book about move semantics. Deleting those member fuctions can be a bug if we want to allow copy semantics, because overload resolution will no longer fallback to the copy constructor/assignment operator when given an rvalue. In particular, this explain why it was not possible to delete the move assignment operator of the StaticModel class. --- src/DataTree.hh | 2 -- src/DynamicModel.hh | 2 -- src/ExprNode.hh | 2 -- src/ModelEquationBlock.hh | 4 ---- src/ModelTree.hh | 2 -- src/ParsingDriver.hh | 4 ---- src/Statement.hh | 2 -- src/StaticModel.hh | 7 ------- src/macro/Driver.hh | 6 +----- 9 files changed, 1 insertion(+), 30 deletions(-) diff --git a/src/DataTree.hh b/src/DataTree.hh index d8f136ca..e4e36f04 100644 --- a/src/DataTree.hh +++ b/src/DataTree.hh @@ -133,9 +133,7 @@ public: virtual ~DataTree() = default; DataTree(const DataTree &d); - DataTree(DataTree &&) = delete; DataTree &operator=(const DataTree &d); - DataTree &operator=(DataTree &&) = delete; //! Some predefined constants NumConstNode *Zero, *One, *Two, *Three, *NaN, *Infinity, *Pi; diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index c53cf524..3a5d97f0 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -312,9 +312,7 @@ public: VarModelTable &var_model_table_arg); DynamicModel(const DynamicModel &m); - DynamicModel(DynamicModel &&) = delete; DynamicModel &operator=(const DynamicModel &m); - DynamicModel &operator=(DynamicModel &&) = delete; //! Compute cross references void computeXrefs(); diff --git a/src/ExprNode.hh b/src/ExprNode.hh index c811d064..0ad7f51a 100644 --- a/src/ExprNode.hh +++ b/src/ExprNode.hh @@ -256,9 +256,7 @@ public: virtual ~ExprNode() = default; ExprNode(const ExprNode &) = delete; - ExprNode(ExprNode &&) = delete; ExprNode &operator=(const ExprNode &) = delete; - ExprNode &operator=(ExprNode &&) = delete; //! Initializes data member non_null_derivatives virtual void prepareForDerivation() = 0; diff --git a/src/ModelEquationBlock.hh b/src/ModelEquationBlock.hh index 93febc43..05f71d12 100644 --- a/src/ModelEquationBlock.hh +++ b/src/ModelEquationBlock.hh @@ -42,9 +42,7 @@ public: const StaticModel &static_model_arg); SteadyStateModel(const SteadyStateModel &m); - SteadyStateModel(SteadyStateModel &&) = delete; SteadyStateModel &operator=(const SteadyStateModel &m); - SteadyStateModel &operator=(SteadyStateModel &&) = delete; //! Add an expression of the form "var = expr;" void addDefinition(int symb_id, expr_t expr); @@ -79,9 +77,7 @@ public: VarModelTable &var_model_table_arg); Epilogue(const Epilogue &m); - Epilogue(Epilogue &&) = delete; Epilogue &operator=(const Epilogue &m); - Epilogue &operator=(Epilogue &&) = delete; //! Add an expression of the form "var = expr;" void addDefinition(int symb_id, expr_t expr); diff --git a/src/ModelTree.hh b/src/ModelTree.hh index 5aeee110..c2684f26 100644 --- a/src/ModelTree.hh +++ b/src/ModelTree.hh @@ -410,9 +410,7 @@ public: bool is_dynamic_arg = false); ModelTree(const ModelTree &m); - ModelTree(ModelTree &&) = delete; ModelTree &operator=(const ModelTree &m); - ModelTree &operator=(ModelTree &&) = delete; //! Absolute value under which a number is considered to be zero double cutoff{1e-15}; diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh index b9a2949e..2284720d 100644 --- a/src/ParsingDriver.hh +++ b/src/ParsingDriver.hh @@ -61,9 +61,7 @@ public: DynareFlex(istream *in = nullptr, ostream *out = nullptr); DynareFlex(const DynareFlex &) = delete; - DynareFlex(DynareFlex &&) = delete; DynareFlex &operator=(const DynareFlex &) = delete; - DynareFlex &operator=(DynareFlex &&) = delete; //! The main lexing function Dynare::parser::token_type lex(Dynare::parser::semantic_type *yylval, @@ -283,9 +281,7 @@ public: }; ParsingDriver(const ParsingDriver &) = delete; - ParsingDriver(ParsingDriver &&) = delete; ParsingDriver &operator=(const ParsingDriver &) = delete; - ParsingDriver &operator=(ParsingDriver &&) = delete; //! Starts parsing, and constructs the MOD file representation unique_ptr<ModFile> parse(istream &in, bool debug); diff --git a/src/Statement.hh b/src/Statement.hh index cf680cae..16f04fcc 100644 --- a/src/Statement.hh +++ b/src/Statement.hh @@ -166,9 +166,7 @@ public: virtual ~Statement() = default; Statement(const Statement &) = delete; - Statement(Statement &&) = delete; Statement &operator=(const Statement &) = delete; - Statement &operator=(Statement &&) = delete; //! Do some internal check, and fill the ModFileStructure class /*! Don't forget to update ComputingTasks.hh, Shocks.hh and diff --git a/src/StaticModel.hh b/src/StaticModel.hh index 29b2b864..ab5cafe0 100644 --- a/src/StaticModel.hh +++ b/src/StaticModel.hh @@ -119,14 +119,7 @@ public: ExternalFunctionsTable &external_functions_table_arg); StaticModel(const StaticModel &m); - StaticModel(StaticModel &&) = delete; StaticModel &operator=(const StaticModel &m); - /* The move assignment operator is not explicitly deleted, otherwise the - static_cast from DynamicModel does not work. However it looks like this - operator will not be used in the end. See - https://en.cppreference.com/w/cpp/language/copy_initialization - With C++17, it should be possible to explicitly delete it */ - //StaticModel & operator=(StaticModel &&) = delete; //! Creates the static version of a dynamic model explicit StaticModel(const DynamicModel &m); diff --git a/src/macro/Driver.hh b/src/macro/Driver.hh index 4d600a80..b28d7bb4 100644 --- a/src/macro/Driver.hh +++ b/src/macro/Driver.hh @@ -1,5 +1,5 @@ /* - * Copyright © 2019-2021 Dynare Team + * Copyright © 2019-2022 Dynare Team * * This file is part of Dynare. * @@ -48,9 +48,7 @@ namespace macro public: TokenizerFlex(istream *in) : TokenizerFlexLexer{in} { } TokenizerFlex(const TokenizerFlex &) = delete; - TokenizerFlex(TokenizerFlex &&) = delete; TokenizerFlex &operator=(const TokenizerFlex &) = delete; - TokenizerFlex &operator=(TokenizerFlex &&) = delete; //! The main lexing function Tokenizer::parser::token_type lex(Tokenizer::parser::semantic_type *yylval, @@ -68,9 +66,7 @@ namespace macro public: Driver() = default; Driver(const Driver &) = delete; - Driver(Driver &&) = delete; Driver &operator=(const Driver &) = delete; - Driver &operator=(Driver &&) = delete; //! Exception thrown when value of an unknown variable is requested class UnknownVariable -- GitLab