diff --git a/include/inja/environment.hpp b/include/inja/environment.hpp
index e102046..9e6f7c4 100644
--- a/include/inja/environment.hpp
+++ b/include/inja/environment.hpp
@@ -34,13 +34,13 @@
 public:
   Environment() : Environment("") {}
 
-  explicit Environment(const std::string &global_path) : input_path(global_path), output_path(global_path) {}
+  explicit Environment(const std::string& global_path) : input_path(global_path), output_path(global_path) {}
 
-  Environment(const std::string &input_path, const std::string &output_path)
+  Environment(const std::string& input_path, const std::string& output_path)
       : input_path(input_path), output_path(output_path) {}
 
   /// Sets the opener and closer for template statements
-  void set_statement(const std::string &open, const std::string &close) {
+  void set_statement(const std::string& open, const std::string& close) {
     lexer_config.statement_open = open;
     lexer_config.statement_open_no_lstrip = open + "+";
     lexer_config.statement_open_force_lstrip = open + "-";
@@ -50,13 +50,13 @@
   }
 
   /// Sets the opener for template line statements
-  void set_line_statement(const std::string &open) {
+  void set_line_statement(const std::string& open) {
     lexer_config.line_statement = open;
     lexer_config.update_open_chars();
   }
 
   /// Sets the opener and closer for template expressions
-  void set_expression(const std::string &open, const std::string &close) {
+  void set_expression(const std::string& open, const std::string& close) {
     lexer_config.expression_open = open;
     lexer_config.expression_open_force_lstrip = open + "-";
     lexer_config.expression_close = close;
@@ -65,7 +65,7 @@
   }
 
   /// Sets the opener and closer for template comments
-  void set_comment(const std::string &open, const std::string &close) {
+  void set_comment(const std::string& open, const std::string& close) {
     lexer_config.comment_open = open;
     lexer_config.comment_open_force_lstrip = open + "-";
     lexer_config.comment_close = close;
@@ -98,68 +98,68 @@
     return parser.parse(input);
   }
 
-  Template parse_template(const std::string &filename) {
+  Template parse_template(const std::string& filename) {
     Parser parser(parser_config, lexer_config, template_storage, function_storage);
     auto result = Template(parser.load_file(input_path + static_cast<std::string>(filename)));
     parser.parse_into_template(result, input_path + static_cast<std::string>(filename));
     return result;
   }
 
-  Template parse_file(const std::string &filename) {
+  Template parse_file(const std::string& filename) {
     return parse_template(filename);
   }
 
-  std::string render(std::string_view input, const json &data) { return render(parse(input), data); }
+  std::string render(std::string_view input, const json& data) { return render(parse(input), data); }
 
-  std::string render(const Template &tmpl, const json &data) {
+  std::string render(const Template& tmpl, const json& data) {
     std::stringstream os;
     render_to(os, tmpl, data);
     return os.str();
   }
 
-  std::string render_file(const std::string &filename, const json &data) {
+  std::string render_file(const std::string& filename, const json& data) {
     return render(parse_template(filename), data);
   }
 
-  std::string render_file_with_json_file(const std::string &filename, const std::string &filename_data) {
+  std::string render_file_with_json_file(const std::string& filename, const std::string& filename_data) {
     const json data = load_json(filename_data);
     return render_file(filename, data);
   }
 
-  void write(const std::string &filename, const json &data, const std::string &filename_out) {
+  void write(const std::string& filename, const json& data, const std::string& filename_out) {
     std::ofstream file(output_path + filename_out);
     file << render_file(filename, data);
     file.close();
   }
 
-  void write(const Template &temp, const json &data, const std::string &filename_out) {
+  void write(const Template& temp, const json& data, const std::string& filename_out) {
     std::ofstream file(output_path + filename_out);
     file << render(temp, data);
     file.close();
   }
 
-  void write_with_json_file(const std::string &filename, const std::string &filename_data,
-                            const std::string &filename_out) {
+  void write_with_json_file(const std::string& filename, const std::string& filename_data,
+                            const std::string& filename_out) {
     const json data = load_json(filename_data);
     write(filename, data, filename_out);
   }
 
-  void write_with_json_file(const Template &temp, const std::string &filename_data, const std::string &filename_out) {
+  void write_with_json_file(const Template& temp, const std::string& filename_data, const std::string& filename_out) {
     const json data = load_json(filename_data);
     write(temp, data, filename_out);
   }
 
-  std::ostream &render_to(std::ostream &os, const Template &tmpl, const json &data) {
+  std::ostream& render_to(std::ostream& os, const Template& tmpl, const json& data) {
     Renderer(render_config, template_storage, function_storage).render_to(os, tmpl, data);
     return os;
   }
 
-  std::string load_file(const std::string &filename) {
+  std::string load_file(const std::string& filename) {
     Parser parser(parser_config, lexer_config, template_storage, function_storage);
     return parser.load_file(input_path + filename);
   }
 
-  json load_json(const std::string &filename) {
+  json load_json(const std::string& filename) {
     std::ifstream file;
     file.open(input_path + filename);
     if (file.fail()) {
@@ -173,28 +173,28 @@
   /*!
   @brief Adds a variadic callback
   */
-  void add_callback(const std::string &name, const CallbackFunction &callback) {
+  void add_callback(const std::string& name, const CallbackFunction& callback) {
     add_callback(name, -1, callback);
   }
 
   /*!
   @brief Adds a variadic void callback
   */
-  void add_void_callback(const std::string &name, const VoidCallbackFunction &callback) {
+  void add_void_callback(const std::string& name, const VoidCallbackFunction& callback) {
     add_void_callback(name, -1, callback);
   }
 
   /*!
   @brief Adds a callback with given number or arguments
   */
-  void add_callback(const std::string &name, int num_args, const CallbackFunction &callback) {
+  void add_callback(const std::string& name, int num_args, const CallbackFunction& callback) {
     function_storage.add_callback(name, num_args, callback);
   }
 
   /*!
   @brief Adds a void callback with given number or arguments
   */
-  void add_void_callback(const std::string &name, int num_args, const VoidCallbackFunction &callback) {
+  void add_void_callback(const std::string& name, int num_args, const VoidCallbackFunction& callback) {
     function_storage.add_callback(name, num_args, [callback](Arguments& args) { callback(args); return json(); });
   }
 
@@ -202,7 +202,7 @@
    * Then, a template can be rendered in another template using the
    * include "<name>" syntax.
    */
-  void include_template(const std::string &name, const Template &tmpl) {
+  void include_template(const std::string& name, const Template& tmpl) {
     template_storage[name] = tmpl;
   }
 
@@ -217,14 +217,14 @@
 /*!
 @brief render with default settings to a string
 */
-inline std::string render(std::string_view input, const json &data) {
+inline std::string render(std::string_view input, const json& data) {
   return Environment().render(input, data);
 }
 
 /*!
 @brief render with default settings to the given output stream
 */
-inline void render_to(std::ostream &os, std::string_view input, const json &data) {
+inline void render_to(std::ostream& os, std::string_view input, const json& data) {
   Environment env;
   env.render_to(os, env.parse(input), data);
 }
diff --git a/include/inja/function_storage.hpp b/include/inja/function_storage.hpp
index 90c3955..1a6641f 100644
--- a/include/inja/function_storage.hpp
+++ b/include/inja/function_storage.hpp
@@ -7,9 +7,9 @@
 
 namespace inja {
 
-using Arguments = std::vector<const json *>;
-using CallbackFunction = std::function<json(Arguments &args)>;
-using VoidCallbackFunction = std::function<void(Arguments &args)>;
+using Arguments = std::vector<const json*>;
+using CallbackFunction = std::function<json(Arguments& args)>;
+using VoidCallbackFunction = std::function<void(Arguments& args)>;
 
 /*!
  * \brief Class for builtin functions and user-defined callbacks.
@@ -69,7 +69,7 @@
   };
 
   struct FunctionData {
-    explicit FunctionData(const Operation &op, const CallbackFunction &cb = CallbackFunction{}) : operation(op), callback(cb) {}
+    explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction{}) : operation(op), callback(cb) {}
     const Operation operation;
     const CallbackFunction callback;
   };
@@ -114,7 +114,7 @@
     function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { op });
   }
 
-  void add_callback(std::string_view name, int num_args, const CallbackFunction &callback) {
+  void add_callback(std::string_view name, int num_args, const CallbackFunction& callback) {
     function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { Operation::Callback, callback });
   }
 
diff --git a/include/inja/lexer.hpp b/include/inja/lexer.hpp
index 7bcbf56..5f45da1 100644
--- a/include/inja/lexer.hpp
+++ b/include/inja/lexer.hpp
@@ -35,7 +35,7 @@
     Number,
   };
 
-  const LexerConfig &config;
+  const LexerConfig& config;
 
   State state;
   MinusState minus_state;
@@ -270,7 +270,7 @@
   }
 
 public:
-  explicit Lexer(const LexerConfig &config) : config(config), state(State::Text), minus_state(MinusState::Number) {}
+  explicit Lexer(const LexerConfig& config) : config(config), state(State::Text), minus_state(MinusState::Number) {}
 
   SourceLocation current_position() const {
     return get_source_location(m_in, tok_start);
@@ -424,7 +424,7 @@
     }
   }
 
-  const LexerConfig &get_config() const {
+  const LexerConfig& get_config() const {
     return config;
   }
 };
diff --git a/include/inja/node.hpp b/include/inja/node.hpp
index da77065..2df0054 100644
--- a/include/inja/node.hpp
+++ b/include/inja/node.hpp
@@ -101,7 +101,7 @@
 public:
   const json value;
 
-  explicit LiteralNode(const json& value, size_t pos) : ExpressionNode(pos), value(value) { }
+  explicit LiteralNode(std::string_view data_text, size_t pos) : ExpressionNode(pos), value(json::parse(data_text)) { }
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
diff --git a/include/inja/parser.hpp b/include/inja/parser.hpp
index e3c26e7..61e2aa8 100644
--- a/include/inja/parser.hpp
+++ b/include/inja/parser.hpp
@@ -23,11 +23,11 @@
  * \brief Class for parsing an inja Template.
  */
 class Parser {
-  const ParserConfig &config;
+  const ParserConfig& config;
 
   Lexer lexer;
-  TemplateStorage &template_storage;
-  const FunctionStorage &function_storage;
+  TemplateStorage& template_storage;
+  const FunctionStorage& function_storage;
 
   Token tok, peek_tok;
   bool have_peek_tok {false};
@@ -48,7 +48,7 @@
   std::stack<ForStatementNode*> for_statement_stack;
   std::stack<BlockStatementNode*> block_statement_stack;
 
-  inline void throw_parser_error(const std::string &message) const {
+  inline void throw_parser_error(const std::string& message) const {
     INJA_THROW(ParserError(message, lexer.current_position()));
   }
 
@@ -70,7 +70,7 @@
 
   inline void add_literal(const char* content_ptr) {
     std::string_view data_text(literal_start.data(), tok.text.data() - literal_start.data() + tok.text.size());
-    arguments.emplace_back(std::make_shared<LiteralNode>(json::parse(data_text), data_text.data() - content_ptr));
+    arguments.emplace_back(std::make_shared<LiteralNode>(data_text, data_text.data() - content_ptr));
   }
 
   inline void add_operator() {
@@ -638,8 +638,8 @@
 
 
 public:
-  explicit Parser(const ParserConfig &parser_config, const LexerConfig &lexer_config,
-                  TemplateStorage &template_storage, const FunctionStorage &function_storage)
+  explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config,
+                  TemplateStorage& template_storage, const FunctionStorage& function_storage)
       : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) { }
 
   Template parse(std::string_view input, std::string_view path) {
diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp
index 2e369c4..67dc09d 100644
--- a/include/inja/renderer.hpp
+++ b/include/inja/renderer.hpp
@@ -325,12 +325,12 @@
       make_result(get_arguments<1>(node)[0]->get<int>() % 2 == 0);
     } break;
     case Op::Exists: {
-      auto &&name = get_arguments<1>(node)[0]->get_ref<const std::string &>();
+      auto &&name = get_arguments<1>(node)[0]->get_ref<const std::string&>();
       make_result(data_input->contains(json::json_pointer(DataNode::convert_dot_to_ptr(name))));
     } break;
     case Op::ExistsInObject: {
       const auto args = get_arguments<2>(node);
-      auto &&name = args[1]->get_ref<const std::string &>();
+      auto &&name = args[1]->get_ref<const std::string&>();
       make_result(args[0]->find(name) != args[0]->end());
     } break;
     case Op::First: {
@@ -338,10 +338,10 @@
       data_eval_stack.push(result);
     } break;
     case Op::Float: {
-      make_result(std::stod(get_arguments<1>(node)[0]->get_ref<const std::string &>()));
+      make_result(std::stod(get_arguments<1>(node)[0]->get_ref<const std::string&>()));
     } break;
     case Op::Int: {
-      make_result(std::stoi(get_arguments<1>(node)[0]->get_ref<const std::string &>()));
+      make_result(std::stoi(get_arguments<1>(node)[0]->get_ref<const std::string&>()));
     } break;
     case Op::Last: {
       const auto result = &get_arguments<1>(node)[0]->back();
@@ -350,7 +350,7 @@
     case Op::Length: {
       const auto val = get_arguments<1>(node)[0];
       if (val->is_string()) {
-        make_result(val->get_ref<const std::string &>().length());
+        make_result(val->get_ref<const std::string&>().length());
       } else {
         make_result(val->size());
       }
diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp
index 715a218..0273fd4 100644
--- a/single_include/inja/inja.hpp
+++ b/single_include/inja/inja.hpp
@@ -94,9 +94,9 @@
 
 namespace inja {
 
-using Arguments = std::vector<const json *>;
-using CallbackFunction = std::function<json(Arguments &args)>;
-using VoidCallbackFunction = std::function<void(Arguments &args)>;
+using Arguments = std::vector<const json*>;
+using CallbackFunction = std::function<json(Arguments& args)>;
+using VoidCallbackFunction = std::function<void(Arguments& args)>;
 
 /*!
  * \brief Class for builtin functions and user-defined callbacks.
@@ -156,7 +156,7 @@
   };
 
   struct FunctionData {
-    explicit FunctionData(const Operation &op, const CallbackFunction &cb = CallbackFunction{}) : operation(op), callback(cb) {}
+    explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction{}) : operation(op), callback(cb) {}
     const Operation operation;
     const CallbackFunction callback;
   };
@@ -201,7 +201,7 @@
     function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { op });
   }
 
-  void add_callback(std::string_view name, int num_args, const CallbackFunction &callback) {
+  void add_callback(std::string_view name, int num_args, const CallbackFunction& callback) {
     function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { Operation::Callback, callback });
   }
 
@@ -442,7 +442,7 @@
 public:
   const json value;
 
-  explicit LiteralNode(const json& value, size_t pos) : ExpressionNode(pos), value(value) { }
+  explicit LiteralNode(std::string_view data_text, size_t pos) : ExpressionNode(pos), value(json::parse(data_text)) { }
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -1027,7 +1027,7 @@
     Number,
   };
 
-  const LexerConfig &config;
+  const LexerConfig& config;
 
   State state;
   MinusState minus_state;
@@ -1262,7 +1262,7 @@
   }
 
 public:
-  explicit Lexer(const LexerConfig &config) : config(config), state(State::Text), minus_state(MinusState::Number) {}
+  explicit Lexer(const LexerConfig& config) : config(config), state(State::Text), minus_state(MinusState::Number) {}
 
   SourceLocation current_position() const {
     return get_source_location(m_in, tok_start);
@@ -1416,7 +1416,7 @@
     }
   }
 
-  const LexerConfig &get_config() const {
+  const LexerConfig& get_config() const {
     return config;
   }
 };
@@ -1441,11 +1441,11 @@
  * \brief Class for parsing an inja Template.
  */
 class Parser {
-  const ParserConfig &config;
+  const ParserConfig& config;
 
   Lexer lexer;
-  TemplateStorage &template_storage;
-  const FunctionStorage &function_storage;
+  TemplateStorage& template_storage;
+  const FunctionStorage& function_storage;
 
   Token tok, peek_tok;
   bool have_peek_tok {false};
@@ -1466,7 +1466,7 @@
   std::stack<ForStatementNode*> for_statement_stack;
   std::stack<BlockStatementNode*> block_statement_stack;
 
-  inline void throw_parser_error(const std::string &message) const {
+  inline void throw_parser_error(const std::string& message) const {
     INJA_THROW(ParserError(message, lexer.current_position()));
   }
 
@@ -1488,7 +1488,7 @@
 
   inline void add_literal(const char* content_ptr) {
     std::string_view data_text(literal_start.data(), tok.text.data() - literal_start.data() + tok.text.size());
-    arguments.emplace_back(std::make_shared<LiteralNode>(json::parse(data_text), data_text.data() - content_ptr));
+    arguments.emplace_back(std::make_shared<LiteralNode>(data_text, data_text.data() - content_ptr));
   }
 
   inline void add_operator() {
@@ -2056,8 +2056,8 @@
 
 
 public:
-  explicit Parser(const ParserConfig &parser_config, const LexerConfig &lexer_config,
-                  TemplateStorage &template_storage, const FunctionStorage &function_storage)
+  explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config,
+                  TemplateStorage& template_storage, const FunctionStorage& function_storage)
       : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) { }
 
   Template parse(std::string_view input, std::string_view path) {
@@ -2426,12 +2426,12 @@
       make_result(get_arguments<1>(node)[0]->get<int>() % 2 == 0);
     } break;
     case Op::Exists: {
-      auto &&name = get_arguments<1>(node)[0]->get_ref<const std::string &>();
+      auto &&name = get_arguments<1>(node)[0]->get_ref<const std::string&>();
       make_result(data_input->contains(json::json_pointer(DataNode::convert_dot_to_ptr(name))));
     } break;
     case Op::ExistsInObject: {
       const auto args = get_arguments<2>(node);
-      auto &&name = args[1]->get_ref<const std::string &>();
+      auto &&name = args[1]->get_ref<const std::string&>();
       make_result(args[0]->find(name) != args[0]->end());
     } break;
     case Op::First: {
@@ -2439,10 +2439,10 @@
       data_eval_stack.push(result);
     } break;
     case Op::Float: {
-      make_result(std::stod(get_arguments<1>(node)[0]->get_ref<const std::string &>()));
+      make_result(std::stod(get_arguments<1>(node)[0]->get_ref<const std::string&>()));
     } break;
     case Op::Int: {
-      make_result(std::stoi(get_arguments<1>(node)[0]->get_ref<const std::string &>()));
+      make_result(std::stoi(get_arguments<1>(node)[0]->get_ref<const std::string&>()));
     } break;
     case Op::Last: {
       const auto result = &get_arguments<1>(node)[0]->back();
@@ -2451,7 +2451,7 @@
     case Op::Length: {
       const auto val = get_arguments<1>(node)[0];
       if (val->is_string()) {
-        make_result(val->get_ref<const std::string &>().length());
+        make_result(val->get_ref<const std::string&>().length());
       } else {
         make_result(val->size());
       }
@@ -2762,13 +2762,13 @@
 public:
   Environment() : Environment("") {}
 
-  explicit Environment(const std::string &global_path) : input_path(global_path), output_path(global_path) {}
+  explicit Environment(const std::string& global_path) : input_path(global_path), output_path(global_path) {}
 
-  Environment(const std::string &input_path, const std::string &output_path)
+  Environment(const std::string& input_path, const std::string& output_path)
       : input_path(input_path), output_path(output_path) {}
 
   /// Sets the opener and closer for template statements
-  void set_statement(const std::string &open, const std::string &close) {
+  void set_statement(const std::string& open, const std::string& close) {
     lexer_config.statement_open = open;
     lexer_config.statement_open_no_lstrip = open + "+";
     lexer_config.statement_open_force_lstrip = open + "-";
@@ -2778,13 +2778,13 @@
   }
 
   /// Sets the opener for template line statements
-  void set_line_statement(const std::string &open) {
+  void set_line_statement(const std::string& open) {
     lexer_config.line_statement = open;
     lexer_config.update_open_chars();
   }
 
   /// Sets the opener and closer for template expressions
-  void set_expression(const std::string &open, const std::string &close) {
+  void set_expression(const std::string& open, const std::string& close) {
     lexer_config.expression_open = open;
     lexer_config.expression_open_force_lstrip = open + "-";
     lexer_config.expression_close = close;
@@ -2793,7 +2793,7 @@
   }
 
   /// Sets the opener and closer for template comments
-  void set_comment(const std::string &open, const std::string &close) {
+  void set_comment(const std::string& open, const std::string& close) {
     lexer_config.comment_open = open;
     lexer_config.comment_open_force_lstrip = open + "-";
     lexer_config.comment_close = close;
@@ -2826,68 +2826,68 @@
     return parser.parse(input);
   }
 
-  Template parse_template(const std::string &filename) {
+  Template parse_template(const std::string& filename) {
     Parser parser(parser_config, lexer_config, template_storage, function_storage);
     auto result = Template(parser.load_file(input_path + static_cast<std::string>(filename)));
     parser.parse_into_template(result, input_path + static_cast<std::string>(filename));
     return result;
   }
 
-  Template parse_file(const std::string &filename) {
+  Template parse_file(const std::string& filename) {
     return parse_template(filename);
   }
 
-  std::string render(std::string_view input, const json &data) { return render(parse(input), data); }
+  std::string render(std::string_view input, const json& data) { return render(parse(input), data); }
 
-  std::string render(const Template &tmpl, const json &data) {
+  std::string render(const Template& tmpl, const json& data) {
     std::stringstream os;
     render_to(os, tmpl, data);
     return os.str();
   }
 
-  std::string render_file(const std::string &filename, const json &data) {
+  std::string render_file(const std::string& filename, const json& data) {
     return render(parse_template(filename), data);
   }
 
-  std::string render_file_with_json_file(const std::string &filename, const std::string &filename_data) {
+  std::string render_file_with_json_file(const std::string& filename, const std::string& filename_data) {
     const json data = load_json(filename_data);
     return render_file(filename, data);
   }
 
-  void write(const std::string &filename, const json &data, const std::string &filename_out) {
+  void write(const std::string& filename, const json& data, const std::string& filename_out) {
     std::ofstream file(output_path + filename_out);
     file << render_file(filename, data);
     file.close();
   }
 
-  void write(const Template &temp, const json &data, const std::string &filename_out) {
+  void write(const Template& temp, const json& data, const std::string& filename_out) {
     std::ofstream file(output_path + filename_out);
     file << render(temp, data);
     file.close();
   }
 
-  void write_with_json_file(const std::string &filename, const std::string &filename_data,
-                            const std::string &filename_out) {
+  void write_with_json_file(const std::string& filename, const std::string& filename_data,
+                            const std::string& filename_out) {
     const json data = load_json(filename_data);
     write(filename, data, filename_out);
   }
 
-  void write_with_json_file(const Template &temp, const std::string &filename_data, const std::string &filename_out) {
+  void write_with_json_file(const Template& temp, const std::string& filename_data, const std::string& filename_out) {
     const json data = load_json(filename_data);
     write(temp, data, filename_out);
   }
 
-  std::ostream &render_to(std::ostream &os, const Template &tmpl, const json &data) {
+  std::ostream& render_to(std::ostream& os, const Template& tmpl, const json& data) {
     Renderer(render_config, template_storage, function_storage).render_to(os, tmpl, data);
     return os;
   }
 
-  std::string load_file(const std::string &filename) {
+  std::string load_file(const std::string& filename) {
     Parser parser(parser_config, lexer_config, template_storage, function_storage);
     return parser.load_file(input_path + filename);
   }
 
-  json load_json(const std::string &filename) {
+  json load_json(const std::string& filename) {
     std::ifstream file;
     file.open(input_path + filename);
     if (file.fail()) {
@@ -2901,28 +2901,28 @@
   /*!
   @brief Adds a variadic callback
   */
-  void add_callback(const std::string &name, const CallbackFunction &callback) {
+  void add_callback(const std::string& name, const CallbackFunction& callback) {
     add_callback(name, -1, callback);
   }
 
   /*!
   @brief Adds a variadic void callback
   */
-  void add_void_callback(const std::string &name, const VoidCallbackFunction &callback) {
+  void add_void_callback(const std::string& name, const VoidCallbackFunction& callback) {
     add_void_callback(name, -1, callback);
   }
 
   /*!
   @brief Adds a callback with given number or arguments
   */
-  void add_callback(const std::string &name, int num_args, const CallbackFunction &callback) {
+  void add_callback(const std::string& name, int num_args, const CallbackFunction& callback) {
     function_storage.add_callback(name, num_args, callback);
   }
 
   /*!
   @brief Adds a void callback with given number or arguments
   */
-  void add_void_callback(const std::string &name, int num_args, const VoidCallbackFunction &callback) {
+  void add_void_callback(const std::string& name, int num_args, const VoidCallbackFunction& callback) {
     function_storage.add_callback(name, num_args, [callback](Arguments& args) { callback(args); return json(); });
   }
 
@@ -2930,7 +2930,7 @@
    * Then, a template can be rendered in another template using the
    * include "<name>" syntax.
    */
-  void include_template(const std::string &name, const Template &tmpl) {
+  void include_template(const std::string& name, const Template& tmpl) {
     template_storage[name] = tmpl;
   }
 
@@ -2945,14 +2945,14 @@
 /*!
 @brief render with default settings to a string
 */
-inline std::string render(std::string_view input, const json &data) {
+inline std::string render(std::string_view input, const json& data) {
   return Environment().render(input, data);
 }
 
 /*!
 @brief render with default settings to the given output stream
 */
-inline void render_to(std::ostream &os, std::string_view input, const json &data) {
+inline void render_to(std::ostream& os, std::string_view input, const json& data) {
   Environment env;
   env.render_to(os, env.parse(input), data);
 }
