Насколько я понимаю, std::find_if()
ниже возвращает итератор
Да, но этот итератор затем разыменовывается в том же выражении.Функция возвращает копию std::type_index
из некоторого элемента args_
, который, предположительно, является каким-либо стандартным контейнером с value_type
из std::pair<std::string, std::type_index>
(или аналогичным).
По предположению, это std::vector<std::pair<std::string, std::type_index>>
, потому что если бы это была карта, вся функция могла бы быть упрощена до
return args_.at(name);
Может кто-нибудь объяснить, почему нет итератораопределяется следующим образом: std::pair<std::string, std::type_index>::iterator = std::find_if(...)
?
Ну, во-первых, std::pair
не имеет члена iterator
.Я предполагаю, что вы имели в виду std::vector<std::pair<std::string, std::type_index>>::iterator
(или какой бы тип коллекции args_
не был).
Не требуется отдельного оператора, объявляющего такой итератор, во многом так же, как вам не нужен отдельный double
в выражении
return floor(3.14 * radius);
, когдаВы хотите вычисление целочисленной окружности.
Где итератор, возвращаемый std::find_if()
, хранится
Везде, где нравится компилятор.Он существует только во время вычисления оператора возврата.
как вы можете вызвать ->second
самостоятельно
Вы не можете.Вы вызываете его по временному значению, возвращенному std::find_if
, и почему после закрывающей скобки std::find_if
?
есть != args_.end()
Нетт.Автор предполагает , что они найдут соответствующий элемент.Если они этого не делают, программа имеет неопределенное поведение.Это может быть преднамеренным, или это может быть ошибка.