Use = default for trivial special members

Applied changes correspond to clang-tidy fixes
stemming from the modernize-use-equals-default check.

Change-Id: I254b0908a76d464131564b637cd0e42a6b03fb5a
diff --git a/include/ceres/autodiff_first_order_function.h b/include/ceres/autodiff_first_order_function.h
index c3c5cb2..fa63785 100644
--- a/include/ceres/autodiff_first_order_function.h
+++ b/include/ceres/autodiff_first_order_function.h
@@ -110,7 +110,7 @@
     static_assert(kNumParameters > 0, "kNumParameters must be positive");
   }
 
-  ~AutoDiffFirstOrderFunction() override {}
+  ~AutoDiffFirstOrderFunction() override = default;
 
   bool Evaluate(const double* const parameters,
                 double* cost,
diff --git a/include/ceres/autodiff_local_parameterization.h b/include/ceres/autodiff_local_parameterization.h
index 38bc45a..aadee81 100644
--- a/include/ceres/autodiff_local_parameterization.h
+++ b/include/ceres/autodiff_local_parameterization.h
@@ -114,7 +114,7 @@
   explicit AutoDiffLocalParameterization(Functor* functor)
       : functor_(functor) {}
 
-  ~AutoDiffLocalParameterization() override {}
+  ~AutoDiffLocalParameterization() override = default;
   bool Plus(const double* x,
             const double* delta,
             double* x_plus_delta) const override {
diff --git a/include/ceres/autodiff_manifold.h b/include/ceres/autodiff_manifold.h
index 9673533..fa326ac 100644
--- a/include/ceres/autodiff_manifold.h
+++ b/include/ceres/autodiff_manifold.h
@@ -152,7 +152,7 @@
   // Takes ownership of functor.
   explicit AutoDiffManifold(Functor* functor) : functor_(functor) {}
 
-  ~AutoDiffManifold() override {}
+  ~AutoDiffManifold() override = default;
 
   int AmbientSize() const override { return kAmbientSize; }
   int TangentSize() const override { return kTangentSize; }
diff --git a/include/ceres/context.h b/include/ceres/context.h
index d08e32b..e22df7e 100644
--- a/include/ceres/context.h
+++ b/include/ceres/context.h
@@ -41,11 +41,11 @@
 // (e.g. threads) managed by the Context.
 class Context {
  public:
-  Context() {}
+  Context() = default;
   Context(const Context&) = delete;
   void operator=(const Context&) = delete;
 
-  virtual ~Context() {}
+  virtual ~Context() = default;
 
   // Creates a context object and the caller takes ownership.
   static Context* Create();
diff --git a/include/ceres/cost_function.h b/include/ceres/cost_function.h
index d1550c1..7e0f2cc 100644
--- a/include/ceres/cost_function.h
+++ b/include/ceres/cost_function.h
@@ -67,7 +67,7 @@
   CostFunction(const CostFunction&) = delete;
   void operator=(const CostFunction&) = delete;
 
-  virtual ~CostFunction() {}
+  virtual ~CostFunction() = default;
 
   // Inputs:
   //
diff --git a/include/ceres/dynamic_cost_function.h b/include/ceres/dynamic_cost_function.h
index 2afb08d..4d0c2bc 100644
--- a/include/ceres/dynamic_cost_function.h
+++ b/include/ceres/dynamic_cost_function.h
@@ -40,7 +40,7 @@
 // parameter blocks and set the number of residuals at run time.
 class CERES_EXPORT DynamicCostFunction : public CostFunction {
  public:
-  ~DynamicCostFunction() override {}
+  ~DynamicCostFunction() override = default;
 
   virtual void AddParameterBlock(int size) {
     mutable_parameter_block_sizes()->push_back(size);
diff --git a/include/ceres/evaluation_callback.h b/include/ceres/evaluation_callback.h
index b9f5bbb..2ff7c47 100644
--- a/include/ceres/evaluation_callback.h
+++ b/include/ceres/evaluation_callback.h
@@ -62,7 +62,7 @@
 // execute faster.
 class CERES_EXPORT EvaluationCallback {
  public:
-  virtual ~EvaluationCallback() {}
+  virtual ~EvaluationCallback() = default;
 
   // Called before Ceres requests residuals or jacobians for a given setting of
   // the parameters. User parameters (the double* values provided to the cost
diff --git a/include/ceres/first_order_function.h b/include/ceres/first_order_function.h
index 1420153..eb66c5a 100644
--- a/include/ceres/first_order_function.h
+++ b/include/ceres/first_order_function.h
@@ -39,7 +39,7 @@
 // and its gradient.
 class CERES_EXPORT FirstOrderFunction {
  public:
-  virtual ~FirstOrderFunction() {}
+  virtual ~FirstOrderFunction() = default;
 
   // cost is never null. gradient may be null. The return value
   // indicates whether the evaluation was successful or not.
diff --git a/include/ceres/iteration_callback.h b/include/ceres/iteration_callback.h
index 4507fdf..d52d466 100644
--- a/include/ceres/iteration_callback.h
+++ b/include/ceres/iteration_callback.h
@@ -194,7 +194,7 @@
 //
 class CERES_EXPORT IterationCallback {
  public:
-  virtual ~IterationCallback() {}
+  virtual ~IterationCallback() = default;
   virtual CallbackReturnType operator()(const IterationSummary& summary) = 0;
 };
 
diff --git a/include/ceres/local_parameterization.h b/include/ceres/local_parameterization.h
index 0144e7d..b92ec9b 100644
--- a/include/ceres/local_parameterization.h
+++ b/include/ceres/local_parameterization.h
@@ -155,7 +155,7 @@
 class CERES_EXPORT IdentityParameterization : public LocalParameterization {
  public:
   explicit IdentityParameterization(int size);
-  ~IdentityParameterization() override {}
+  ~IdentityParameterization() override = default;
   bool Plus(const double* x,
             const double* delta,
             double* x_plus_delta) const override;
@@ -176,7 +176,7 @@
  public:
   explicit SubsetParameterization(int size,
                                   const std::vector<int>& constant_parameters);
-  ~SubsetParameterization() override {}
+  ~SubsetParameterization() override = default;
   bool Plus(const double* x,
             const double* delta,
             double* x_plus_delta) const override;
@@ -201,7 +201,7 @@
 // theta) part.
 class CERES_EXPORT QuaternionParameterization : public LocalParameterization {
  public:
-  ~QuaternionParameterization() override {}
+  ~QuaternionParameterization() override = default;
   bool Plus(const double* x,
             const double* delta,
             double* x_plus_delta) const override;
@@ -224,7 +224,7 @@
 class CERES_EXPORT EigenQuaternionParameterization
     : public ceres::LocalParameterization {
  public:
-  ~EigenQuaternionParameterization() override {}
+  ~EigenQuaternionParameterization() override = default;
   bool Plus(const double* x,
             const double* delta,
             double* x_plus_delta) const override;
@@ -250,7 +250,7 @@
     : public LocalParameterization {
  public:
   explicit HomogeneousVectorParameterization(int size);
-  ~HomogeneousVectorParameterization() override {}
+  ~HomogeneousVectorParameterization() override = default;
   bool Plus(const double* x,
             const double* delta,
             double* x_plus_delta) const override;
@@ -306,7 +306,7 @@
  public:
   ProductParameterization(const ProductParameterization&) = delete;
   ProductParameterization& operator=(const ProductParameterization&) = delete;
-  ~ProductParameterization() override {}
+  ~ProductParameterization() override = default;
   //
   // NOTE: The constructor takes ownership of the input local
   // parameterizations.
diff --git a/include/ceres/loss_function.h b/include/ceres/loss_function.h
index 5c7bb85..4da78bf 100644
--- a/include/ceres/loss_function.h
+++ b/include/ceres/loss_function.h
@@ -85,7 +85,7 @@
 
 class CERES_EXPORT LossFunction {
  public:
-  virtual ~LossFunction() {}
+  virtual ~LossFunction() = default;
 
   // For a residual vector with squared 2-norm 'sq_norm', this method
   // is required to fill in the value and derivatives of the loss
diff --git a/include/ceres/manifold.h b/include/ceres/manifold.h
index c3715d9..da56500 100644
--- a/include/ceres/manifold.h
+++ b/include/ceres/manifold.h
@@ -293,7 +293,7 @@
  public:
   ProductManifold(const ProductManifold&) = delete;
   ProductManifold& operator=(const ProductManifold&) = delete;
-  ~ProductManifold() override {}
+  ~ProductManifold() override = default;
 
   // NOTE: The constructor takes ownership of the input
   // manifolds.
diff --git a/include/ceres/sized_cost_function.h b/include/ceres/sized_cost_function.h
index 55355bd..b8a6a8c 100644
--- a/include/ceres/sized_cost_function.h
+++ b/include/ceres/sized_cost_function.h
@@ -61,7 +61,7 @@
     *mutable_parameter_block_sizes() = std::vector<int32_t>{Ns...};
   }
 
-  ~SizedCostFunction() override {}
+  ~SizedCostFunction() override = default;
 
   // Subclasses must implement Evaluate().
 };
diff --git a/internal/ceres/autodiff_benchmarks/brdf_cost_function.h b/internal/ceres/autodiff_benchmarks/brdf_cost_function.h
index 9d7c0cc..715d8b0 100644
--- a/internal/ceres/autodiff_benchmarks/brdf_cost_function.h
+++ b/internal/ceres/autodiff_benchmarks/brdf_cost_function.h
@@ -45,7 +45,7 @@
 // https://github.com/wdas/brdf/blob/master/src/brdfs/disney.brdf
 struct Brdf {
  public:
-  Brdf() {}
+  Brdf() = default;
 
   template <typename T>
   inline bool operator()(const T* const material,
diff --git a/internal/ceres/block_jacobi_preconditioner.cc b/internal/ceres/block_jacobi_preconditioner.cc
index 6f37aca..7459310 100644
--- a/internal/ceres/block_jacobi_preconditioner.cc
+++ b/internal/ceres/block_jacobi_preconditioner.cc
@@ -50,7 +50,7 @@
   m_.reset(new BlockRandomAccessDiagonalMatrix(blocks));
 }
 
-BlockJacobiPreconditioner::~BlockJacobiPreconditioner() {}
+BlockJacobiPreconditioner::~BlockJacobiPreconditioner() = default;
 
 bool BlockJacobiPreconditioner::UpdateImpl(const BlockSparseMatrix& A,
                                            const double* D) {
diff --git a/internal/ceres/block_random_access_dense_matrix.cc b/internal/ceres/block_random_access_dense_matrix.cc
index 386f81e..f2ac0b8 100644
--- a/internal/ceres/block_random_access_dense_matrix.cc
+++ b/internal/ceres/block_random_access_dense_matrix.cc
@@ -60,7 +60,7 @@
 
 // Assume that the user does not hold any locks on any cell blocks
 // when they are calling SetZero.
-BlockRandomAccessDenseMatrix::~BlockRandomAccessDenseMatrix() {}
+BlockRandomAccessDenseMatrix::~BlockRandomAccessDenseMatrix() = default;
 
 CellInfo* BlockRandomAccessDenseMatrix::GetCell(const int row_block_id,
                                                 const int col_block_id,
diff --git a/internal/ceres/block_random_access_matrix.cc b/internal/ceres/block_random_access_matrix.cc
index ea88855..8e70c04 100644
--- a/internal/ceres/block_random_access_matrix.cc
+++ b/internal/ceres/block_random_access_matrix.cc
@@ -33,7 +33,7 @@
 namespace ceres {
 namespace internal {
 
-BlockRandomAccessMatrix::~BlockRandomAccessMatrix() {}
+BlockRandomAccessMatrix::~BlockRandomAccessMatrix() = default;
 
 }  // namespace internal
 }  // namespace ceres
diff --git a/internal/ceres/block_sparse_matrix.cc b/internal/ceres/block_sparse_matrix.cc
index 5efd2e1..4db409d 100644
--- a/internal/ceres/block_sparse_matrix.cc
+++ b/internal/ceres/block_sparse_matrix.cc
@@ -46,7 +46,7 @@
 
 using std::vector;
 
-BlockSparseMatrix::~BlockSparseMatrix() {}
+BlockSparseMatrix::~BlockSparseMatrix() = default;
 
 BlockSparseMatrix::BlockSparseMatrix(
     CompressedRowBlockStructure* block_structure)
diff --git a/internal/ceres/block_structure.h b/internal/ceres/block_structure.h
index d49d7d3..39f85a2 100644
--- a/internal/ceres/block_structure.h
+++ b/internal/ceres/block_structure.h
@@ -71,7 +71,7 @@
 bool CellLessThan(const Cell& lhs, const Cell& rhs);
 
 struct CompressedList {
-  CompressedList() {}
+  CompressedList() = default;
 
   // Construct a CompressedList with the cells containing num_cells
   // entries.
diff --git a/internal/ceres/c_api.cc b/internal/ceres/c_api.cc
index a813fd4..a604e56 100644
--- a/internal/ceres/c_api.cc
+++ b/internal/ceres/c_api.cc
@@ -78,7 +78,7 @@
     }
   }
 
-  ~CallbackCostFunction() override {}
+  ~CallbackCostFunction() override = default;
 
   bool Evaluate(double const* const* parameters,
                 double* residuals,
diff --git a/internal/ceres/callbacks.cc b/internal/ceres/callbacks.cc
index a2692cc..70e2409 100644
--- a/internal/ceres/callbacks.cc
+++ b/internal/ceres/callbacks.cc
@@ -45,7 +45,7 @@
                                              double* parameters)
     : program_(program), parameters_(parameters) {}
 
-StateUpdatingCallback::~StateUpdatingCallback() {}
+StateUpdatingCallback::~StateUpdatingCallback() = default;
 
 CallbackReturnType StateUpdatingCallback::operator()(
     const IterationSummary& summary) {
@@ -64,7 +64,7 @@
       user_parameters_(user_parameters) {}
 
 GradientProblemSolverStateUpdatingCallback::
-    ~GradientProblemSolverStateUpdatingCallback() {}
+    ~GradientProblemSolverStateUpdatingCallback() = default;
 
 CallbackReturnType GradientProblemSolverStateUpdatingCallback::operator()(
     const IterationSummary& summary) {
@@ -80,7 +80,7 @@
                                  const bool log_to_stdout)
     : minimizer_type(minimizer_type), log_to_stdout_(log_to_stdout) {}
 
-LoggingCallback::~LoggingCallback() {}
+LoggingCallback::~LoggingCallback() = default;
 
 CallbackReturnType LoggingCallback::operator()(
     const IterationSummary& summary) {
diff --git a/internal/ceres/canonical_views_clustering.cc b/internal/ceres/canonical_views_clustering.cc
index c193735..740ab8e 100644
--- a/internal/ceres/canonical_views_clustering.cc
+++ b/internal/ceres/canonical_views_clustering.cc
@@ -48,7 +48,7 @@
 
 class CanonicalViewsClustering {
  public:
-  CanonicalViewsClustering() {}
+  CanonicalViewsClustering() = default;
 
   // Compute the canonical views clustering of the vertices of the
   // graph. centers will contain the vertices that are the identified
diff --git a/internal/ceres/cgnr_linear_operator.h b/internal/ceres/cgnr_linear_operator.h
index 82dcf2d..a0d9e85 100644
--- a/internal/ceres/cgnr_linear_operator.h
+++ b/internal/ceres/cgnr_linear_operator.h
@@ -82,7 +82,7 @@
  public:
   CgnrLinearOperator(const LinearOperator& A, const double* D)
       : A_(A), D_(D), z_(new double[A.num_rows()]) {}
-  ~CgnrLinearOperator() override {}
+  ~CgnrLinearOperator() override = default;
 
   void RightMultiply(const double* x, double* y) const final {
     std::fill(z_.get(), z_.get() + A_.num_rows(), 0.0);
diff --git a/internal/ceres/cgnr_solver.cc b/internal/ceres/cgnr_solver.cc
index 9dba1cf..2f38d30 100644
--- a/internal/ceres/cgnr_solver.cc
+++ b/internal/ceres/cgnr_solver.cc
@@ -54,7 +54,7 @@
   }
 }
 
-CgnrSolver::~CgnrSolver() {}
+CgnrSolver::~CgnrSolver() = default;
 
 LinearSolver::Summary CgnrSolver::SolveImpl(
     BlockSparseMatrix* A,
diff --git a/internal/ceres/compressed_row_sparse_matrix.cc b/internal/ceres/compressed_row_sparse_matrix.cc
index 900586c..b9e2715 100644
--- a/internal/ceres/compressed_row_sparse_matrix.cc
+++ b/internal/ceres/compressed_row_sparse_matrix.cc
@@ -266,7 +266,7 @@
   CHECK_EQ(num_nonzeros(), num_rows);
 }
 
-CompressedRowSparseMatrix::~CompressedRowSparseMatrix() {}
+CompressedRowSparseMatrix::~CompressedRowSparseMatrix() = default;
 
 void CompressedRowSparseMatrix::SetZero() {
   std::fill(values_.begin(), values_.end(), 0);
diff --git a/internal/ceres/context_impl.h b/internal/ceres/context_impl.h
index 384db12..f94d559 100644
--- a/internal/ceres/context_impl.h
+++ b/internal/ceres/context_impl.h
@@ -47,11 +47,11 @@
 
 class CERES_EXPORT_INTERNAL ContextImpl : public Context {
  public:
-  ContextImpl() {}
+  ContextImpl() = default;
   ContextImpl(const ContextImpl&) = delete;
   void operator=(const ContextImpl&) = delete;
 
-  ~ContextImpl() override {}
+  ~ContextImpl() override = default;
 
   // When compiled with C++ threading support, resize the thread pool to have
   // at min(num_thread, num_hardware_threads) where num_hardware_threads is
diff --git a/internal/ceres/coordinate_descent_minimizer.cc b/internal/ceres/coordinate_descent_minimizer.cc
index 93096ac..3c566c7 100644
--- a/internal/ceres/coordinate_descent_minimizer.cc
+++ b/internal/ceres/coordinate_descent_minimizer.cc
@@ -64,7 +64,7 @@
   CHECK(context_ != nullptr);
 }
 
-CoordinateDescentMinimizer::~CoordinateDescentMinimizer() {}
+CoordinateDescentMinimizer::~CoordinateDescentMinimizer() = default;
 
 bool CoordinateDescentMinimizer::Init(
     const Program& program,
diff --git a/internal/ceres/covariance.cc b/internal/ceres/covariance.cc
index 8e240ff..ead3287 100644
--- a/internal/ceres/covariance.cc
+++ b/internal/ceres/covariance.cc
@@ -47,7 +47,7 @@
   impl_.reset(new internal::CovarianceImpl(options));
 }
 
-Covariance::~Covariance() {}
+Covariance::~Covariance() = default;
 
 bool Covariance::Compute(
     const vector<pair<const double*, const double*>>& covariance_blocks,
diff --git a/internal/ceres/covariance_impl.cc b/internal/ceres/covariance_impl.cc
index 7ca23a8..8c00384 100644
--- a/internal/ceres/covariance_impl.cc
+++ b/internal/ceres/covariance_impl.cc
@@ -79,7 +79,7 @@
   evaluate_options_.apply_loss_function = options_.apply_loss_function;
 }
 
-CovarianceImpl::~CovarianceImpl() {}
+CovarianceImpl::~CovarianceImpl() = default;
 
 template <typename T>
 void CheckForDuplicates(std::vector<T> blocks) {
diff --git a/internal/ceres/covariance_test.cc b/internal/ceres/covariance_test.cc
index 410212b..e39b2ae 100644
--- a/internal/ceres/covariance_test.cc
+++ b/internal/ceres/covariance_test.cc
@@ -379,7 +379,7 @@
 // x_plus_delta = delta * x;
 class PolynomialParameterization : public LocalParameterization {
  public:
-  ~PolynomialParameterization() final {}
+  ~PolynomialParameterization() final = default;
 
   bool Plus(const double* x,
             const double* delta,
@@ -402,7 +402,7 @@
 // x_plus_delta = delta * x;
 class PolynomialManifold : public Manifold {
  public:
-  ~PolynomialManifold() final {}
+  ~PolynomialManifold() final = default;
 
   bool Plus(const double* x,
             const double* delta,
diff --git a/internal/ceres/cuda_buffer.h b/internal/ceres/cuda_buffer.h
index 2d983af..44e7de3 100644
--- a/internal/ceres/cuda_buffer.h
+++ b/internal/ceres/cuda_buffer.h
@@ -49,7 +49,7 @@
 template <typename T>
 class CudaBuffer {
  public:
-  CudaBuffer() {}
+  CudaBuffer() = default;
   CudaBuffer(const CudaBuffer&) = delete;
   CudaBuffer& operator=(const CudaBuffer&) = delete;
 
diff --git a/internal/ceres/dense_cholesky.h b/internal/ceres/dense_cholesky.h
index 470998a..a3514b4 100644
--- a/internal/ceres/dense_cholesky.h
+++ b/internal/ceres/dense_cholesky.h
@@ -153,7 +153,7 @@
                                     std::string* message) override;
 
  private:
-  CUDADenseCholesky32Bit() {}
+  CUDADenseCholesky32Bit() = default;
   // Initializes the cuSolverDN context, creates an asynchronous stream, and
   // associates the stream with cuSolverDN. Returns true iff initialization was
   // successful, else it returns false and a human-readable error message is
@@ -198,7 +198,7 @@
                                     std::string* message) override;
 
  private:
-  CUDADenseCholesky64Bit() {}
+  CUDADenseCholesky64Bit() = default;
   // Initializes the cuSolverDN context, creates an asynchronous stream, and
   // associates the stream with cuSolverDN. Returns true iff initialization was
   // successful, else it returns false and a human-readable error message is
diff --git a/internal/ceres/dogleg_strategy.h b/internal/ceres/dogleg_strategy.h
index 5042767..d79fb35 100644
--- a/internal/ceres/dogleg_strategy.h
+++ b/internal/ceres/dogleg_strategy.h
@@ -56,7 +56,7 @@
 class CERES_EXPORT_INTERNAL DoglegStrategy : public TrustRegionStrategy {
  public:
   explicit DoglegStrategy(const TrustRegionStrategy::Options& options);
-  ~DoglegStrategy() override {}
+  ~DoglegStrategy() override = default;
 
   // TrustRegionStrategy interface
   Summary ComputeStep(const PerSolveOptions& per_solve_options,
diff --git a/internal/ceres/dynamic_sparse_normal_cholesky_solver.h b/internal/ceres/dynamic_sparse_normal_cholesky_solver.h
index 04be570..6a2cb33 100644
--- a/internal/ceres/dynamic_sparse_normal_cholesky_solver.h
+++ b/internal/ceres/dynamic_sparse_normal_cholesky_solver.h
@@ -58,7 +58,7 @@
  public:
   explicit DynamicSparseNormalCholeskySolver(
       const LinearSolver::Options& options);
-  ~DynamicSparseNormalCholeskySolver() override {}
+  ~DynamicSparseNormalCholeskySolver() override = default;
 
  private:
   LinearSolver::Summary SolveImpl(CompressedRowSparseMatrix* A,
diff --git a/internal/ceres/eigensparse.cc b/internal/ceres/eigensparse.cc
index f24672c..1c47a02 100644
--- a/internal/ceres/eigensparse.cc
+++ b/internal/ceres/eigensparse.cc
@@ -48,7 +48,7 @@
 class EigenSparseCholeskyTemplate : public SparseCholesky {
  public:
   EigenSparseCholeskyTemplate() : analyzed_(false) {}
-  ~EigenSparseCholeskyTemplate() override {}
+  ~EigenSparseCholeskyTemplate() override = default;
   CompressedRowSparseMatrix::StorageType StorageType() const final {
     return CompressedRowSparseMatrix::LOWER_TRIANGULAR;
   }
@@ -160,7 +160,7 @@
   return sparse_cholesky;
 }
 
-EigenSparseCholesky::~EigenSparseCholesky() {}
+EigenSparseCholesky::~EigenSparseCholesky() = default;
 
 std::unique_ptr<SparseCholesky> FloatEigenSparseCholesky::Create(
     const OrderingType ordering_type) {
@@ -182,7 +182,7 @@
   return sparse_cholesky;
 }
 
-FloatEigenSparseCholesky::~FloatEigenSparseCholesky() {}
+FloatEigenSparseCholesky::~FloatEigenSparseCholesky() = default;
 
 }  // namespace internal
 }  // namespace ceres
diff --git a/internal/ceres/evaluation_callback_test.cc b/internal/ceres/evaluation_callback_test.cc
index 3736405..f81f3bd 100644
--- a/internal/ceres/evaluation_callback_test.cc
+++ b/internal/ceres/evaluation_callback_test.cc
@@ -72,7 +72,7 @@
         evaluate_num_calls(0),
         evaluate_last_parameter_hash(kUninitialized) {}
 
-  ~WigglyBowlCostFunctionAndEvaluationCallback() override {}
+  ~WigglyBowlCostFunctionAndEvaluationCallback() override = default;
 
   // Evaluation callback interface. This checks that all the preconditions are
   // met at the point that Ceres calls into it.
diff --git a/internal/ceres/evaluator.cc b/internal/ceres/evaluator.cc
index 5168741..4d69f96 100644
--- a/internal/ceres/evaluator.cc
+++ b/internal/ceres/evaluator.cc
@@ -48,7 +48,7 @@
 namespace ceres {
 namespace internal {
 
-Evaluator::~Evaluator() {}
+Evaluator::~Evaluator() = default;
 
 Evaluator* Evaluator::Create(const Evaluator::Options& options,
                              Program* program,
diff --git a/internal/ceres/fixed_array_test.cc b/internal/ceres/fixed_array_test.cc
index f29f809..287230a 100644
--- a/internal/ceres/fixed_array_test.cc
+++ b/internal/ceres/fixed_array_test.cc
@@ -500,8 +500,8 @@
 
 // PickyDelete EXPECTs its class-scope deallocation funcs are unused.
 struct PickyDelete {
-  PickyDelete() {}
-  ~PickyDelete() {}
+  PickyDelete() = default;
+  ~PickyDelete() = default;
   void operator delete(void* p) {
     EXPECT_TRUE(false) << __FUNCTION__;
     ::operator delete(p);
diff --git a/internal/ceres/gradient_checking_cost_function.cc b/internal/ceres/gradient_checking_cost_function.cc
index fbc8ea5..f786b83 100644
--- a/internal/ceres/gradient_checking_cost_function.cc
+++ b/internal/ceres/gradient_checking_cost_function.cc
@@ -80,7 +80,7 @@
     set_num_residuals(function->num_residuals());
   }
 
-  ~GradientCheckingCostFunction() override {}
+  ~GradientCheckingCostFunction() override = default;
 
   bool Evaluate(double const* const* parameters,
                 double* residuals,
diff --git a/internal/ceres/gradient_checking_cost_function_test.cc b/internal/ceres/gradient_checking_cost_function_test.cc
index 6a6e075..264a858 100644
--- a/internal/ceres/gradient_checking_cost_function_test.cc
+++ b/internal/ceres/gradient_checking_cost_function_test.cc
@@ -268,7 +268,7 @@
     set_num_residuals(num_residuals);
     mutable_parameter_block_sizes()->push_back(parameter_block_size);
   }
-  ~UnaryCostFunction() override {}
+  ~UnaryCostFunction() override = default;
 
   bool Evaluate(double const* const* parameters,
                 double* residuals,
diff --git a/internal/ceres/gradient_problem_evaluator.h b/internal/ceres/gradient_problem_evaluator.h
index 453a390..a510b25 100644
--- a/internal/ceres/gradient_problem_evaluator.h
+++ b/internal/ceres/gradient_problem_evaluator.h
@@ -47,7 +47,7 @@
  public:
   explicit GradientProblemEvaluator(const GradientProblem& problem)
       : problem_(problem) {}
-  ~GradientProblemEvaluator() override {}
+  ~GradientProblemEvaluator() override = default;
   SparseMatrix* CreateJacobian() const final { return nullptr; }
   bool Evaluate(const EvaluateOptions& evaluate_options,
                 const double* state,
diff --git a/internal/ceres/gradient_problem_solver.cc b/internal/ceres/gradient_problem_solver.cc
index b72fad9..f754274 100644
--- a/internal/ceres/gradient_problem_solver.cc
+++ b/internal/ceres/gradient_problem_solver.cc
@@ -92,7 +92,7 @@
   return solver_options.IsValid(error);
 }
 
-GradientProblemSolver::~GradientProblemSolver() {}
+GradientProblemSolver::~GradientProblemSolver() = default;
 
 void GradientProblemSolver::Solve(const GradientProblemSolver::Options& options,
                                   const GradientProblem& problem,
diff --git a/internal/ceres/gradient_problem_solver_test.cc b/internal/ceres/gradient_problem_solver_test.cc
index 6d014df..e3b4085 100644
--- a/internal/ceres/gradient_problem_solver_test.cc
+++ b/internal/ceres/gradient_problem_solver_test.cc
@@ -39,7 +39,7 @@
 // Rosenbrock function; see http://en.wikipedia.org/wiki/Rosenbrock_function .
 class Rosenbrock : public ceres::FirstOrderFunction {
  public:
-  ~Rosenbrock() override {}
+  ~Rosenbrock() override = default;
 
   bool Evaluate(const double* parameters,
                 double* cost,
@@ -73,7 +73,7 @@
 }
 
 class QuadraticFunction : public ceres::FirstOrderFunction {
-  ~QuadraticFunction() override {}
+  ~QuadraticFunction() override = default;
   bool Evaluate(const double* parameters,
                 double* cost,
                 double* gradient) const final {
@@ -90,7 +90,7 @@
 
 struct RememberingCallback : public IterationCallback {
   explicit RememberingCallback(double* x) : calls(0), x(x) {}
-  ~RememberingCallback() override {}
+  ~RememberingCallback() override = default;
   CallbackReturnType operator()(const IterationSummary& summary) final {
     x_values.push_back(*x);
     return SOLVER_CONTINUE;
diff --git a/internal/ceres/graph.h b/internal/ceres/graph.h
index 9b26158..ef65453 100644
--- a/internal/ceres/graph.h
+++ b/internal/ceres/graph.h
@@ -49,7 +49,7 @@
 template <typename Vertex>
 class Graph {
  public:
-  Graph() {}
+  Graph() = default;
 
   // Add a vertex.
   void AddVertex(const Vertex& vertex) {
@@ -106,7 +106,7 @@
 template <typename Vertex>
 class WeightedGraph {
  public:
-  WeightedGraph() {}
+  WeightedGraph() = default;
 
   // Add a weighted vertex. If the vertex already exists in the graph,
   // its weight is set to the new weight.
diff --git a/internal/ceres/implicit_schur_complement.cc b/internal/ceres/implicit_schur_complement.cc
index f2196d4..bb2da17 100644
--- a/internal/ceres/implicit_schur_complement.cc
+++ b/internal/ceres/implicit_schur_complement.cc
@@ -45,7 +45,7 @@
     const LinearSolver::Options& options)
     : options_(options), D_(NULL), b_(NULL) {}
 
-ImplicitSchurComplement::~ImplicitSchurComplement() {}
+ImplicitSchurComplement::~ImplicitSchurComplement() = default;
 
 void ImplicitSchurComplement::Init(const BlockSparseMatrix& A,
                                    const double* D,
diff --git a/internal/ceres/iterative_refiner.cc b/internal/ceres/iterative_refiner.cc
index 5f0bfdd..1815469 100644
--- a/internal/ceres/iterative_refiner.cc
+++ b/internal/ceres/iterative_refiner.cc
@@ -42,7 +42,7 @@
 IterativeRefiner::IterativeRefiner(const int max_num_iterations)
     : max_num_iterations_(max_num_iterations) {}
 
-IterativeRefiner::~IterativeRefiner() {}
+IterativeRefiner::~IterativeRefiner() = default;
 
 void IterativeRefiner::Allocate(int num_cols) {
   residual_.resize(num_cols);
diff --git a/internal/ceres/iterative_refiner_test.cc b/internal/ceres/iterative_refiner_test.cc
index 2591375..d3ec9a2 100644
--- a/internal/ceres/iterative_refiner_test.cc
+++ b/internal/ceres/iterative_refiner_test.cc
@@ -54,7 +54,7 @@
 class FakeSparseMatrix : public SparseMatrix {
  public:
   FakeSparseMatrix(const Matrix& m) : m_(m) {}
-  ~FakeSparseMatrix() override {}
+  ~FakeSparseMatrix() override = default;
 
   // y += Ax
   void RightMultiply(const double* x, double* y) const final {
@@ -90,7 +90,7 @@
 class FakeSparseCholesky : public SparseCholesky {
  public:
   FakeSparseCholesky(const Matrix& lhs) { lhs_ = lhs.cast<Scalar>(); }
-  ~FakeSparseCholesky() override {}
+  ~FakeSparseCholesky() override = default;
 
   LinearSolverTerminationType Solve(const double* rhs_ptr,
                                     double* solution_ptr,
diff --git a/internal/ceres/iterative_schur_complement_solver.cc b/internal/ceres/iterative_schur_complement_solver.cc
index 143df5e..e6340df 100644
--- a/internal/ceres/iterative_schur_complement_solver.cc
+++ b/internal/ceres/iterative_schur_complement_solver.cc
@@ -57,7 +57,7 @@
     const LinearSolver::Options& options)
     : options_(options) {}
 
-IterativeSchurComplementSolver::~IterativeSchurComplementSolver() {}
+IterativeSchurComplementSolver::~IterativeSchurComplementSolver() = default;
 
 LinearSolver::Summary IterativeSchurComplementSolver::SolveImpl(
     BlockSparseMatrix* A,
diff --git a/internal/ceres/levenberg_marquardt_strategy.cc b/internal/ceres/levenberg_marquardt_strategy.cc
index cb0e937..2445f5b 100644
--- a/internal/ceres/levenberg_marquardt_strategy.cc
+++ b/internal/ceres/levenberg_marquardt_strategy.cc
@@ -61,7 +61,7 @@
   CHECK_GT(max_radius_, 0.0);
 }
 
-LevenbergMarquardtStrategy::~LevenbergMarquardtStrategy() {}
+LevenbergMarquardtStrategy::~LevenbergMarquardtStrategy() = default;
 
 TrustRegionStrategy::Summary LevenbergMarquardtStrategy::ComputeStep(
     const TrustRegionStrategy::PerSolveOptions& per_solve_options,
diff --git a/internal/ceres/levenberg_marquardt_strategy_test.cc b/internal/ceres/levenberg_marquardt_strategy_test.cc
index c1b88ce..c05dad1 100644
--- a/internal/ceres/levenberg_marquardt_strategy_test.cc
+++ b/internal/ceres/levenberg_marquardt_strategy_test.cc
@@ -58,7 +58,7 @@
   RegularizationCheckingLinearSolver(const int num_cols, const double* diagonal)
       : num_cols_(num_cols), diagonal_(diagonal) {}
 
-  ~RegularizationCheckingLinearSolver() override {}
+  ~RegularizationCheckingLinearSolver() override = default;
 
  private:
   LinearSolver::Summary SolveImpl(
diff --git a/internal/ceres/line_search.h b/internal/ceres/line_search.h
index 124cedb..0af4884 100644
--- a/internal/ceres/line_search.h
+++ b/internal/ceres/line_search.h
@@ -161,7 +161,7 @@
   };
 
   explicit LineSearch(const LineSearch::Options& options);
-  virtual ~LineSearch() {}
+  virtual ~LineSearch() = default;
 
   static LineSearch* Create(const LineSearchType line_search_type,
                             const LineSearch::Options& options,
@@ -260,7 +260,7 @@
 class ArmijoLineSearch : public LineSearch {
  public:
   explicit ArmijoLineSearch(const LineSearch::Options& options);
-  ~ArmijoLineSearch() override {}
+  ~ArmijoLineSearch() override = default;
 
  private:
   void DoSearch(double step_size_estimate,
@@ -279,7 +279,7 @@
 class WolfeLineSearch : public LineSearch {
  public:
   explicit WolfeLineSearch(const LineSearch::Options& options);
-  ~WolfeLineSearch() override {}
+  ~WolfeLineSearch() override = default;
 
   // Returns true iff either a valid point, or valid bracket are found.
   bool BracketingPhase(const FunctionSample& initial_position,
diff --git a/internal/ceres/line_search_direction.cc b/internal/ceres/line_search_direction.cc
index 12c83c8..2b707fb 100644
--- a/internal/ceres/line_search_direction.cc
+++ b/internal/ceres/line_search_direction.cc
@@ -40,7 +40,7 @@
 
 class SteepestDescent : public LineSearchDirection {
  public:
-  ~SteepestDescent() override {}
+  ~SteepestDescent() override = default;
   bool NextDirection(const LineSearchMinimizer::State& previous,
                      const LineSearchMinimizer::State& current,
                      Vector* search_direction) override {
@@ -105,7 +105,7 @@
                                   use_approximate_eigenvalue_bfgs_scaling),
         is_positive_definite_(true) {}
 
-  ~LBFGS() override {}
+  ~LBFGS() override = default;
 
   bool NextDirection(const LineSearchMinimizer::State& previous,
                      const LineSearchMinimizer::State& current,
@@ -161,7 +161,7 @@
     inverse_hessian_ = Matrix::Identity(num_parameters, num_parameters);
   }
 
-  ~BFGS() override {}
+  ~BFGS() override = default;
 
   bool NextDirection(const LineSearchMinimizer::State& previous,
                      const LineSearchMinimizer::State& current,
diff --git a/internal/ceres/line_search_direction.h b/internal/ceres/line_search_direction.h
index 2fcf472..e8b1139 100644
--- a/internal/ceres/line_search_direction.h
+++ b/internal/ceres/line_search_direction.h
@@ -59,7 +59,7 @@
 
   static LineSearchDirection* Create(const Options& options);
 
-  virtual ~LineSearchDirection() {}
+  virtual ~LineSearchDirection() = default;
   virtual bool NextDirection(const LineSearchMinimizer::State& previous,
                              const LineSearchMinimizer::State& current,
                              Vector* search_direction) = 0;
diff --git a/internal/ceres/line_search_minimizer.h b/internal/ceres/line_search_minimizer.h
index 802b542..ae4670a 100644
--- a/internal/ceres/line_search_minimizer.h
+++ b/internal/ceres/line_search_minimizer.h
@@ -63,7 +63,7 @@
     double step_size;
   };
 
-  ~LineSearchMinimizer() override {}
+  ~LineSearchMinimizer() override = default;
   void Minimize(const Minimizer::Options& options,
                 double* parameters,
                 Solver::Summary* summary) final;
diff --git a/internal/ceres/line_search_preprocessor.cc b/internal/ceres/line_search_preprocessor.cc
index 6a69425..465d9a4 100644
--- a/internal/ceres/line_search_preprocessor.cc
+++ b/internal/ceres/line_search_preprocessor.cc
@@ -70,7 +70,7 @@
 
 }  // namespace
 
-LineSearchPreprocessor::~LineSearchPreprocessor() {}
+LineSearchPreprocessor::~LineSearchPreprocessor() = default;
 
 bool LineSearchPreprocessor::Preprocess(const Solver::Options& options,
                                         ProblemImpl* problem,
diff --git a/internal/ceres/linear_operator.cc b/internal/ceres/linear_operator.cc
index 548c724..88b7cc7 100644
--- a/internal/ceres/linear_operator.cc
+++ b/internal/ceres/linear_operator.cc
@@ -33,7 +33,7 @@
 namespace ceres {
 namespace internal {
 
-LinearOperator::~LinearOperator() {}
+LinearOperator::~LinearOperator() = default;
 
 }  // namespace internal
 }  // namespace ceres
diff --git a/internal/ceres/linear_solver.cc b/internal/ceres/linear_solver.cc
index 6cae248..befaa14 100644
--- a/internal/ceres/linear_solver.cc
+++ b/internal/ceres/linear_solver.cc
@@ -43,7 +43,7 @@
 namespace ceres {
 namespace internal {
 
-LinearSolver::~LinearSolver() {}
+LinearSolver::~LinearSolver() = default;
 
 LinearSolverType LinearSolver::LinearSolverForZeroEBlocks(
     LinearSolverType linear_solver_type) {
diff --git a/internal/ceres/linear_solver.h b/internal/ceres/linear_solver.h
index 93aee39..f4616cd 100644
--- a/internal/ceres/linear_solver.h
+++ b/internal/ceres/linear_solver.h
@@ -301,7 +301,7 @@
 template <typename MatrixType>
 class TypedLinearSolver : public LinearSolver {
  public:
-  ~TypedLinearSolver() override {}
+  ~TypedLinearSolver() override = default;
   LinearSolver::Summary Solve(
       LinearOperator* A,
       const double* b,
diff --git a/internal/ceres/local_parameterization.cc b/internal/ceres/local_parameterization.cc
index 62947f0..33e2aa0 100644
--- a/internal/ceres/local_parameterization.cc
+++ b/internal/ceres/local_parameterization.cc
@@ -43,7 +43,7 @@
 
 using std::vector;
 
-LocalParameterization::~LocalParameterization() {}
+LocalParameterization::~LocalParameterization() = default;
 
 bool LocalParameterization::MultiplyByJacobian(const double* x,
                                                const int num_rows,
diff --git a/internal/ceres/low_rank_inverse_hessian.h b/internal/ceres/low_rank_inverse_hessian.h
index 3fabb0c..a7a572c 100644
--- a/internal/ceres/low_rank_inverse_hessian.h
+++ b/internal/ceres/low_rank_inverse_hessian.h
@@ -73,7 +73,7 @@
   LowRankInverseHessian(int num_parameters,
                         int max_num_corrections,
                         bool use_approximate_eigenvalue_scaling);
-  ~LowRankInverseHessian() override {}
+  ~LowRankInverseHessian() override = default;
 
   // Update the low rank approximation. delta_x is the change in the
   // domain of Hessian, and delta_gradient is the change in the
diff --git a/internal/ceres/manifold_adapter.h b/internal/ceres/manifold_adapter.h
index 153dd97..2efec3a 100644
--- a/internal/ceres/manifold_adapter.h
+++ b/internal/ceres/manifold_adapter.h
@@ -15,7 +15,7 @@
     CHECK(local_parameterization != nullptr);
   }
 
-  ~ManifoldAdapter() override {}
+  ~ManifoldAdapter() override = default;
 
   bool Plus(const double* x,
             const double* delta,
diff --git a/internal/ceres/miniglog/glog/logging.h b/internal/ceres/miniglog/glog/logging.h
index 303cd8e..34f26a5 100644
--- a/internal/ceres/miniglog/glog/logging.h
+++ b/internal/ceres/miniglog/glog/logging.h
@@ -138,7 +138,7 @@
 // This implementation is not thread safe.
 class CERES_EXPORT LogSink {
  public:
-  virtual ~LogSink() {}
+  virtual ~LogSink() = default;
   virtual void send(LogSeverity severity,
                     const char* full_filename,
                     const char* base_filename,
@@ -294,7 +294,7 @@
 // is not used" and "statement has no effect".
 class CERES_EXPORT LoggerVoidify {
  public:
-  LoggerVoidify() {}
+  LoggerVoidify() = default;
   // This has to be an operator with a precedence lower than << but
   // higher than ?:
   void operator&(const std::ostream& s) {}
diff --git a/internal/ceres/minimizer.cc b/internal/ceres/minimizer.cc
index b96e0c9..8e27c7b 100644
--- a/internal/ceres/minimizer.cc
+++ b/internal/ceres/minimizer.cc
@@ -51,7 +51,7 @@
   return NULL;
 }
 
-Minimizer::~Minimizer() {}
+Minimizer::~Minimizer() = default;
 
 bool Minimizer::RunCallbacks(const Minimizer::Options& options,
                              const IterationSummary& iteration_summary,
diff --git a/internal/ceres/minimizer_test.cc b/internal/ceres/minimizer_test.cc
index 22b3a19..909beab 100644
--- a/internal/ceres/minimizer_test.cc
+++ b/internal/ceres/minimizer_test.cc
@@ -39,7 +39,7 @@
 
 class FakeIterationCallback : public IterationCallback {
  public:
-  ~FakeIterationCallback() override {}
+  ~FakeIterationCallback() override = default;
   CallbackReturnType operator()(const IterationSummary& summary) final {
     return SOLVER_CONTINUE;
   }
@@ -62,7 +62,7 @@
 
 class AbortingIterationCallback : public IterationCallback {
  public:
-  ~AbortingIterationCallback() override {}
+  ~AbortingIterationCallback() override = default;
   CallbackReturnType operator()(const IterationSummary& summary) final {
     return SOLVER_ABORT;
   }
@@ -80,7 +80,7 @@
 
 class SucceedingIterationCallback : public IterationCallback {
  public:
-  ~SucceedingIterationCallback() override {}
+  ~SucceedingIterationCallback() override = default;
   CallbackReturnType operator()(const IterationSummary& summary) final {
     return SOLVER_TERMINATE_SUCCESSFULLY;
   }
diff --git a/internal/ceres/parameter_block_test.cc b/internal/ceres/parameter_block_test.cc
index f7923b3..e0da433 100644
--- a/internal/ceres/parameter_block_test.cc
+++ b/internal/ceres/parameter_block_test.cc
@@ -111,7 +111,7 @@
 
 struct TestManifold : public Manifold {
  public:
-  ~TestManifold() final {}
+  ~TestManifold() final = default;
 
   bool Plus(const double* x,
             const double* delta,
@@ -166,7 +166,7 @@
 class BadManifold : public Manifold {
  public:
   BadManifold() : calls_(0) {}
-  ~BadManifold() final {}
+  ~BadManifold() final = default;
 
   bool Plus(const double* x,
             const double* delta,
diff --git a/internal/ceres/partitioned_matrix_view.h b/internal/ceres/partitioned_matrix_view.h
index b39aa3e..4761050 100644
--- a/internal/ceres/partitioned_matrix_view.h
+++ b/internal/ceres/partitioned_matrix_view.h
@@ -62,7 +62,7 @@
 // wrong output.
 class CERES_EXPORT_INTERNAL PartitionedMatrixViewBase {
  public:
-  virtual ~PartitionedMatrixViewBase() {}
+  virtual ~PartitionedMatrixViewBase() = default;
 
   // y += E'x
   virtual void LeftMultiplyE(const double* x, double* y) const = 0;
diff --git a/internal/ceres/partitioned_matrix_view_impl.h b/internal/ceres/partitioned_matrix_view_impl.h
index 0b6a57f..22594ef 100644
--- a/internal/ceres/partitioned_matrix_view_impl.h
+++ b/internal/ceres/partitioned_matrix_view_impl.h
@@ -82,7 +82,7 @@
 
 template <int kRowBlockSize, int kEBlockSize, int kFBlockSize>
 PartitionedMatrixView<kRowBlockSize, kEBlockSize, kFBlockSize>::
-    ~PartitionedMatrixView() {}
+    ~PartitionedMatrixView() = default;
 
 // The next four methods don't seem to be particularly cache
 // friendly. This is an artifact of how the BlockStructure of the
diff --git a/internal/ceres/preconditioner.cc b/internal/ceres/preconditioner.cc
index 69ba04d..17b9629c 100644
--- a/internal/ceres/preconditioner.cc
+++ b/internal/ceres/preconditioner.cc
@@ -35,7 +35,7 @@
 namespace ceres {
 namespace internal {
 
-Preconditioner::~Preconditioner() {}
+Preconditioner::~Preconditioner() = default;
 
 PreconditionerType Preconditioner::PreconditionerForZeroEBlocks(
     PreconditionerType preconditioner_type) {
@@ -53,7 +53,8 @@
   CHECK(matrix != nullptr);
 }
 
-SparseMatrixPreconditionerWrapper::~SparseMatrixPreconditionerWrapper() {}
+SparseMatrixPreconditionerWrapper::~SparseMatrixPreconditionerWrapper() =
+    default;
 
 bool SparseMatrixPreconditionerWrapper::UpdateImpl(const SparseMatrix& A,
                                                    const double* D) {
diff --git a/internal/ceres/preconditioner.h b/internal/ceres/preconditioner.h
index 331cc9c..6a6bc61 100644
--- a/internal/ceres/preconditioner.h
+++ b/internal/ceres/preconditioner.h
@@ -149,7 +149,7 @@
 template <typename MatrixType>
 class TypedPreconditioner : public Preconditioner {
  public:
-  ~TypedPreconditioner() override {}
+  ~TypedPreconditioner() override = default;
   bool Update(const LinearOperator& A, const double* D) final {
     return UpdateImpl(*down_cast<const MatrixType*>(&A), D);
   }
diff --git a/internal/ceres/preprocessor.cc b/internal/ceres/preprocessor.cc
index cd8c48c..097ac64 100644
--- a/internal/ceres/preprocessor.cc
+++ b/internal/ceres/preprocessor.cc
@@ -54,7 +54,7 @@
   return NULL;
 }
 
-Preprocessor::~Preprocessor() {}
+Preprocessor::~Preprocessor() = default;
 
 void ChangeNumThreadsIfNeeded(Solver::Options* options) {
   if (options->num_threads == 1) {
diff --git a/internal/ceres/problem.cc b/internal/ceres/problem.cc
index e6a7350..5926bce 100644
--- a/internal/ceres/problem.cc
+++ b/internal/ceres/problem.cc
@@ -46,7 +46,7 @@
 // Not inline defaulted in declaration due to use of std::unique_ptr.
 Problem::Problem(Problem&&) = default;
 Problem& Problem::operator=(Problem&&) = default;
-Problem::~Problem() {}
+Problem::~Problem() = default;
 
 ResidualBlockId Problem::AddResidualBlock(
     CostFunction* cost_function,
diff --git a/internal/ceres/problem_test.cc b/internal/ceres/problem_test.cc
index d2ccf63..483ae07 100644
--- a/internal/ceres/problem_test.cc
+++ b/internal/ceres/problem_test.cc
@@ -67,7 +67,7 @@
     mutable_parameter_block_sizes()->push_back(parameter_block_size);
   }
 
-  ~UnaryCostFunction() override {}
+  ~UnaryCostFunction() override = default;
 
   bool Evaluate(double const* const* parameters,
                 double* residuals,
diff --git a/internal/ceres/program.cc b/internal/ceres/program.cc
index 5fba205..516d58d 100644
--- a/internal/ceres/program.cc
+++ b/internal/ceres/program.cc
@@ -54,12 +54,11 @@
 namespace ceres {
 namespace internal {
 
-Program::Program() {}
+Program::Program() = default;
 
 Program::Program(const Program& program)
-    : parameter_blocks_(program.parameter_blocks_),
-      residual_blocks_(program.residual_blocks_),
-      evaluation_callback_(program.evaluation_callback_) {}
+
+    = default;
 
 const std::vector<ParameterBlock*>& Program::parameter_blocks() const {
   return parameter_blocks_;
diff --git a/internal/ceres/program_test.cc b/internal/ceres/program_test.cc
index 7fdf300..d12cfa5 100644
--- a/internal/ceres/program_test.cc
+++ b/internal/ceres/program_test.cc
@@ -331,7 +331,7 @@
     }
   }
 
-  ~NumParameterBlocksCostFunction() override {}
+  ~NumParameterBlocksCostFunction() override = default;
 
   bool Evaluate(double const* const* parameters,
                 double* residuals,
diff --git a/internal/ceres/schur_complement_solver.cc b/internal/ceres/schur_complement_solver.cc
index cd62f40..57419c2 100644
--- a/internal/ceres/schur_complement_solver.cc
+++ b/internal/ceres/schur_complement_solver.cc
@@ -68,7 +68,7 @@
       const BlockRandomAccessSparseMatrix& m)
       : m_(m) {}
 
-  ~BlockRandomAccessSparseMatrixAdapter() override {}
+  ~BlockRandomAccessSparseMatrixAdapter() override = default;
 
   // y = y + Ax;
   void RightMultiply(const double* x, double* y) const final {
@@ -93,7 +93,7 @@
       const BlockRandomAccessDiagonalMatrix& m)
       : m_(m) {}
 
-  ~BlockRandomAccessDiagonalMatrixAdapter() override {}
+  ~BlockRandomAccessDiagonalMatrixAdapter() override = default;
 
   // y = y + Ax;
   void RightMultiply(const double* x, double* y) const final {
@@ -122,7 +122,7 @@
   CHECK(options.context != nullptr);
 }
 
-SchurComplementSolver::~SchurComplementSolver() {}
+SchurComplementSolver::~SchurComplementSolver() = default;
 
 LinearSolver::Summary SchurComplementSolver::SolveImpl(
     BlockSparseMatrix* A,
@@ -188,7 +188,7 @@
     : SchurComplementSolver(options),
       cholesky_(DenseCholesky::Create(options)) {}
 
-DenseSchurComplementSolver::~DenseSchurComplementSolver() {}
+DenseSchurComplementSolver::~DenseSchurComplementSolver() = default;
 
 // Initialize a BlockRandomAccessDenseMatrix to store the Schur
 // complement.
@@ -240,7 +240,7 @@
   }
 }
 
-SparseSchurComplementSolver::~SparseSchurComplementSolver() {}
+SparseSchurComplementSolver::~SparseSchurComplementSolver() = default;
 
 // Determine the non-zero blocks in the Schur Complement matrix, and
 // initialize a BlockRandomAccessSparseMatrix object.
diff --git a/internal/ceres/schur_eliminator.h b/internal/ceres/schur_eliminator.h
index 2fb59d4..a9eada5 100644
--- a/internal/ceres/schur_eliminator.h
+++ b/internal/ceres/schur_eliminator.h
@@ -165,7 +165,7 @@
 // Example usage: Please see schur_complement_solver.cc
 class CERES_EXPORT_INTERNAL SchurEliminatorBase {
  public:
-  virtual ~SchurEliminatorBase() {}
+  virtual ~SchurEliminatorBase() = default;
 
   // Initialize the eliminator. It is the user's responsibilty to call
   // this function before calling Eliminate or BackSubstitute. It is
@@ -379,7 +379,7 @@
           int kFBlockSize = Eigen::Dynamic>
 class SchurEliminatorForOneFBlock : public SchurEliminatorBase {
  public:
-  ~SchurEliminatorForOneFBlock() override {}
+  ~SchurEliminatorForOneFBlock() override = default;
   void Init(int num_eliminate_blocks,
             bool assume_full_rank_ete,
             const CompressedRowBlockStructure* bs) override {
diff --git a/internal/ceres/schur_jacobi_preconditioner.cc b/internal/ceres/schur_jacobi_preconditioner.cc
index 89d770b..283cd4b 100644
--- a/internal/ceres/schur_jacobi_preconditioner.cc
+++ b/internal/ceres/schur_jacobi_preconditioner.cc
@@ -62,7 +62,7 @@
   InitEliminator(bs);
 }
 
-SchurJacobiPreconditioner::~SchurJacobiPreconditioner() {}
+SchurJacobiPreconditioner::~SchurJacobiPreconditioner() = default;
 
 // Initialize the SchurEliminator.
 void SchurJacobiPreconditioner::InitEliminator(
diff --git a/internal/ceres/solver.cc b/internal/ceres/solver.cc
index dfde122..491f066 100644
--- a/internal/ceres/solver.cc
+++ b/internal/ceres/solver.cc
@@ -485,7 +485,7 @@
   return LineSearchOptionsAreValid(*this, error);
 }
 
-Solver::~Solver() {}
+Solver::~Solver() = default;
 
 void Solver::Solve(const Solver::Options& options,
                    Problem* problem,
diff --git a/internal/ceres/solver_test.cc b/internal/ceres/solver_test.cc
index 465262c..41f3872 100644
--- a/internal/ceres/solver_test.cc
+++ b/internal/ceres/solver_test.cc
@@ -78,7 +78,7 @@
 
 struct RememberingCallback : public IterationCallback {
   explicit RememberingCallback(double* x) : calls(0), x(x) {}
-  ~RememberingCallback() override {}
+  ~RememberingCallback() override = default;
   CallbackReturnType operator()(const IterationSummary& summary) final {
     x_values.push_back(*x);
     return SOLVER_CONTINUE;
@@ -89,7 +89,7 @@
 };
 
 struct NoOpEvaluationCallback : EvaluationCallback {
-  ~NoOpEvaluationCallback() override {}
+  ~NoOpEvaluationCallback() override = default;
   void PrepareForEvaluation(bool evaluate_jacobians,
                             bool new_evaluation_point) final {
     (void)evaluate_jacobians;
diff --git a/internal/ceres/sparse_cholesky.cc b/internal/ceres/sparse_cholesky.cc
index 91cdf67..c71d2fe 100644
--- a/internal/ceres/sparse_cholesky.cc
+++ b/internal/ceres/sparse_cholesky.cc
@@ -113,7 +113,7 @@
   return sparse_cholesky;
 }
 
-SparseCholesky::~SparseCholesky() {}
+SparseCholesky::~SparseCholesky() = default;
 
 LinearSolverTerminationType SparseCholesky::FactorAndSolve(
     CompressedRowSparseMatrix* lhs,
@@ -133,7 +133,7 @@
     : sparse_cholesky_(std::move(sparse_cholesky)),
       iterative_refiner_(std::move(iterative_refiner)) {}
 
-RefinedSparseCholesky::~RefinedSparseCholesky() {}
+RefinedSparseCholesky::~RefinedSparseCholesky() = default;
 
 CompressedRowSparseMatrix::StorageType RefinedSparseCholesky::StorageType()
     const {
diff --git a/internal/ceres/sparse_matrix.cc b/internal/ceres/sparse_matrix.cc
index 32388f5..bc757ea 100644
--- a/internal/ceres/sparse_matrix.cc
+++ b/internal/ceres/sparse_matrix.cc
@@ -33,7 +33,7 @@
 namespace ceres {
 namespace internal {
 
-SparseMatrix::~SparseMatrix() {}
+SparseMatrix::~SparseMatrix() = default;
 
 }  // namespace internal
 }  // namespace ceres
diff --git a/internal/ceres/sparse_normal_cholesky_solver.cc b/internal/ceres/sparse_normal_cholesky_solver.cc
index 0f2e589..1ffce8f 100644
--- a/internal/ceres/sparse_normal_cholesky_solver.cc
+++ b/internal/ceres/sparse_normal_cholesky_solver.cc
@@ -54,7 +54,7 @@
   sparse_cholesky_ = SparseCholesky::Create(options);
 }
 
-SparseNormalCholeskySolver::~SparseNormalCholeskySolver() {}
+SparseNormalCholeskySolver::~SparseNormalCholeskySolver() = default;
 
 LinearSolver::Summary SparseNormalCholeskySolver::SolveImpl(
     BlockSparseMatrix* A,
diff --git a/internal/ceres/subset_preconditioner.cc b/internal/ceres/subset_preconditioner.cc
index 779a34a..e5146ce 100644
--- a/internal/ceres/subset_preconditioner.cc
+++ b/internal/ceres/subset_preconditioner.cc
@@ -55,7 +55,7 @@
   sparse_cholesky_ = SparseCholesky::Create(sparse_cholesky_options);
 }
 
-SubsetPreconditioner::~SubsetPreconditioner() {}
+SubsetPreconditioner::~SubsetPreconditioner() = default;
 
 void SubsetPreconditioner::RightMultiply(const double* x, double* y) const {
   CHECK(x != nullptr);
diff --git a/internal/ceres/thread_pool.cc b/internal/ceres/thread_pool.cc
index 821431c..69753df 100644
--- a/internal/ceres/thread_pool.cc
+++ b/internal/ceres/thread_pool.cc
@@ -57,7 +57,7 @@
                                    : num_hardware_threads;
 }
 
-ThreadPool::ThreadPool() {}
+ThreadPool::ThreadPool() = default;
 
 ThreadPool::ThreadPool(int num_threads) { Resize(num_threads); }
 
diff --git a/internal/ceres/triplet_sparse_matrix.cc b/internal/ceres/triplet_sparse_matrix.cc
index 5dbf0e7..e4f7f9b 100644
--- a/internal/ceres/triplet_sparse_matrix.cc
+++ b/internal/ceres/triplet_sparse_matrix.cc
@@ -45,7 +45,7 @@
 TripletSparseMatrix::TripletSparseMatrix()
     : num_rows_(0), num_cols_(0), max_num_nonzeros_(0), num_nonzeros_(0) {}
 
-TripletSparseMatrix::~TripletSparseMatrix() {}
+TripletSparseMatrix::~TripletSparseMatrix() = default;
 
 TripletSparseMatrix::TripletSparseMatrix(int num_rows,
                                          int num_cols,
diff --git a/internal/ceres/trust_region_minimizer.cc b/internal/ceres/trust_region_minimizer.cc
index d848795..5e292bb 100644
--- a/internal/ceres/trust_region_minimizer.cc
+++ b/internal/ceres/trust_region_minimizer.cc
@@ -62,7 +62,7 @@
 namespace ceres {
 namespace internal {
 
-TrustRegionMinimizer::~TrustRegionMinimizer() {}
+TrustRegionMinimizer::~TrustRegionMinimizer() = default;
 
 void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
                                     double* parameters,
diff --git a/internal/ceres/trust_region_minimizer_test.cc b/internal/ceres/trust_region_minimizer_test.cc
index 3181068..7f2c931 100644
--- a/internal/ceres/trust_region_minimizer_test.cc
+++ b/internal/ceres/trust_region_minimizer_test.cc
@@ -76,7 +76,7 @@
   }
   // clang-format on
 
-  ~PowellEvaluator2() override {}
+  ~PowellEvaluator2() override = default;
 
   // Implementation of Evaluator interface.
   SparseMatrix* CreateJacobian() const final {
diff --git a/internal/ceres/trust_region_preprocessor.cc b/internal/ceres/trust_region_preprocessor.cc
index 0943edb..fc76369 100644
--- a/internal/ceres/trust_region_preprocessor.cc
+++ b/internal/ceres/trust_region_preprocessor.cc
@@ -355,7 +355,7 @@
 
 }  // namespace
 
-TrustRegionPreprocessor::~TrustRegionPreprocessor() {}
+TrustRegionPreprocessor::~TrustRegionPreprocessor() = default;
 
 bool TrustRegionPreprocessor::Preprocess(const Solver::Options& options,
                                          ProblemImpl* problem,
diff --git a/internal/ceres/trust_region_strategy.cc b/internal/ceres/trust_region_strategy.cc
index 7e429d5..235bf98 100644
--- a/internal/ceres/trust_region_strategy.cc
+++ b/internal/ceres/trust_region_strategy.cc
@@ -38,7 +38,7 @@
 namespace ceres {
 namespace internal {
 
-TrustRegionStrategy::~TrustRegionStrategy() {}
+TrustRegionStrategy::~TrustRegionStrategy() = default;
 
 TrustRegionStrategy* TrustRegionStrategy::Create(const Options& options) {
   switch (options.trust_region_strategy_type) {
diff --git a/internal/ceres/visibility_based_preconditioner.cc b/internal/ceres/visibility_based_preconditioner.cc
index 0cf4afa..566dcfa 100644
--- a/internal/ceres/visibility_based_preconditioner.cc
+++ b/internal/ceres/visibility_based_preconditioner.cc
@@ -125,7 +125,7 @@
           << " eliminator time: " << eliminator_time - storage_time;
 }
 
-VisibilityBasedPreconditioner::~VisibilityBasedPreconditioner() {}
+VisibilityBasedPreconditioner::~VisibilityBasedPreconditioner() = default;
 
 // Determine the sparsity structure of the CLUSTER_JACOBI
 // preconditioner. It clusters cameras using their scene