В boost directory_iterator example - how to list directory files not recursive (см this answer) является пример кодаЯвляется {} допустимым аргументом для перехода к функции, ожидающей итератора (представляющей std :: end() какого-либо контейнера)?
#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>
#include <iostream>
...
using namespace boost::filesystem;
for(auto& entry : boost::make_iterator_range(directory_iterator(p), {}))
{
std::cout << entry << "\n";
}
(. p
имеет тип boost::filesystem::path
)
После глядя на documentation for make_iterator_range
, я думаю конструктор вызывается это один:
template< class ForwardTraversalIterator >
iterator_range<ForwardTraversalIterator>
make_iterator_range(ForwardTraversalIterator Begin,
ForwardTraversalIterator End);
Если я прав, то второй аргумент передан в примере кода выше, {}
, похоже, соответствует концу любого контейнера, который невидимо повторен с помощью directory_iterator
.
Я никогда раньше этого не видел.
Возможно ли построить итератор end
только путем создания значения такого итератора из пустого списка инициализаторов {}
? (Могу ли я даже формулируя это правильно?)
Я бы не против того, кто-то заклинание, что происходит под капотом, учитывая, что тип итератора, сконструированным должен соответствовать типу первого итератора (directory_iterator(p)
). (? Является ли аргумент шаблона вычет здесь происходит)
'{}' будет 'directory_iterator {}'. Некоторые типы итераторов используют дефолтный объект конструкции в 'end'. – Jarod42
@ Jarod42 «boost :: make_iterator_range» знает, что второй аргумент должен быть типа 'directory_iterator' из-за вывода аргумента шаблона?Подумайте об этом, исходя из самого определения 'make_iterator_range', которое я скопировал в этот вопрос, это довольно очевидно, что это так. –
Стоит отметить, что в VS 2013 этот код не будет построен без явного 'directory_iterator {}' в качестве аргумента - простой '{}' не компилируется. Ах, хорошо. Я надеюсь, что это законный C++ 11 с простой '{}'. –