@@ -844,11 +844,11 @@ namespace argparse
844844 {
845845 if (impl.has_nargs_number ())
846846 {
847- parse_arguments_number (impl, value , name_for_error, tokens);
847+ value = parse_arguments_number (impl, name_for_error, tokens);
848848 }
849849 else
850850 {
851- parse_arguments_option (impl, value , name_for_error, tokens);
851+ value = parse_arguments_option (impl, name_for_error, tokens);
852852 }
853853 }
854854 else
@@ -878,51 +878,50 @@ namespace argparse
878878 }
879879
880880 private:
881- auto parse_arguments_number (ArgumentImpl const & impl, std::any & value, std:: function<std::string()> name_for_error, std::ranges::view auto tokens) const -> void
881+ auto parse_arguments_number (ArgumentImpl const & impl, std::function<std::string()> name_for_error, std::ranges::view auto tokens) const -> std::any
882882 {
883883 auto const nargs_number = impl.get_nargs_number ();
884884 auto const values = impl.consume_tokens (tokens | std::views::take (nargs_number), name_for_error);
885885 if (values.size () < nargs_number)
886886 {
887887 throw parsing_error (std::format (" argument {}: expected {} argument{}" , impl.get_joined_names (), std::to_string (nargs_number), nargs_number > 1 ? " s" : " " ));
888888 }
889- value = impl.get_transformed (values);
889+ return impl.get_transformed (values);
890890 }
891891
892- auto parse_arguments_option (ArgumentImpl const & impl, std::any & value, std:: function<std::string()> name_for_error, std::ranges::view auto tokens) const -> void
892+ auto parse_arguments_option (ArgumentImpl const & impl, std::function<std::string()> name_for_error, std::ranges::view auto tokens) const -> std::any
893893 {
894894 switch (impl.get_nargs_option ())
895895 {
896896 case zero_or_one:
897897 {
898898 if (!tokens.empty ())
899899 {
900- value = impl.consume_token (tokens.front (), name_for_error);
900+ return impl.consume_token (tokens.front (), name_for_error);
901901 }
902902 else
903903 {
904- value = impl.get_const ();
904+ return impl.get_const ();
905905 }
906- break ;
907906 }
908907 case zero_or_more:
909908 {
910- value = impl.parse_arguments (tokens, name_for_error);
911- break ;
909+ return impl.parse_arguments (tokens, name_for_error);
912910 }
913911 case one_or_more:
914912 {
915913 if (auto const values = impl.consume_tokens (tokens, name_for_error); !values.empty ())
916914 {
917- value = impl.get_transformed (values);
915+ return impl.get_transformed (values);
918916 }
919917 else
920918 {
921919 throw parsing_error (std::format (" argument {}: expected at least one argument" , impl.get_joined_names ()));
922920 }
923- break ;
924921 }
925922 }
923+
924+ std::unreachable ();
926925 }
927926 };
928927
@@ -1109,36 +1108,39 @@ namespace argparse
11091108 class PositionalArgument final : public Argument, public Formattable
11101109 {
11111110 private:
1112- auto parse_arguments_option (std::ranges::view auto tokens) -> void
1111+ auto parse_arguments_option (std::ranges::view auto tokens) -> std::any
11131112 {
11141113 switch (get_nargs_option ())
11151114 {
11161115 case zero_or_one:
11171116 {
11181117 if (!tokens.empty ())
11191118 {
1120- m_value = m_impl.consume_token (tokens.front (), get_name_for_error ());
1119+ return m_impl.consume_token (tokens.front (), get_name_for_error ());
11211120 }
11221121 else
11231122 {
1124- m_value = m_impl.get_default ();
1123+ return m_impl.get_default ();
11251124 }
1126- break ;
11271125 }
11281126 case zero_or_more:
11291127 {
1130- m_value = m_impl.parse_arguments (tokens, get_name_for_error ());
1131- break ;
1128+ return m_impl.parse_arguments (tokens, get_name_for_error ());
11321129 }
11331130 case one_or_more:
11341131 {
11351132 if (auto const values = m_impl.consume_tokens (tokens, get_name_for_error ()); !values.empty ())
11361133 {
1137- m_value = m_impl.get_transformed (values);
1134+ return m_impl.get_transformed (values);
1135+ }
1136+ else
1137+ {
1138+ return std::any ();
11381139 }
1139- break ;
11401140 }
11411141 }
1142+
1143+ std::unreachable ();
11421144 }
11431145
11441146 auto get_name_for_error () const -> std::function<std::string()>
@@ -1202,7 +1204,7 @@ namespace argparse
12021204 }
12031205 else
12041206 {
1205- parse_arguments_option (consumable);
1207+ m_value = parse_arguments_option (consumable);
12061208 }
12071209 }
12081210 else
0 commit comments