{} 是传递给需要迭代器的函数的有效参数(代表某个容器的 std::end() )吗?

Is {} a valid argument to pass to a function expecting an iterator (representing std::end() of some container)?

boost directory_iterator example - how to list directory files not recursive (see this answer)中是示例代码

#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 迭代器? (我的措辞是否正确?)

鉴于如此构造的迭代器的 type 必须与第一个迭代器的类型匹配( directory_iterator(p))。 (这里是模板参数推导吗?)

这里是 boost::make_iterator_range 的各种重载:

template< class ForwardTraversalIterator >
iterator_range< ForwardTraversalIterator >
make_iterator_range( ForwardTraversalIterator Begin, 
                     ForwardTraversalIterator End );

template< class ForwardRange >
iterator_range< typename range_iterator<ForwardRange>::type >
make_iterator_range( ForwardRange& r );

template< class ForwardRange >
iterator_range< typename range_iterator<const ForwardRange>::type >
make_iterator_range( const ForwardRange& r );

template< class Range >
iterator_range< typename range_iterator<Range>::type >
make_iterator_range( Range& r,
                     typename range_difference<Range>::type advance_begin,
                     typename range_difference<Range>::type advance_end );

template< class Range >
iterator_range< typename range_iterator<const Range>::type >
make_iterator_range( const Range& r, 
                     typename range_difference<const Range>::type advance_begin,
                     typename range_difference<const Range>::type advance_end );

因为你的代码已经指定第一个参数是类型 directory_iterator,第二个参数的唯一有效类型是directory_iterator毫不含糊

因此,不需要指定类型。 {}directory_iterator{} 同义,也与 directory_iterator() 同义。

是的,有效。

除了您通常调用的模板参数推导外,没有其他模板参数推导:您的第一个参数是 directory_iterator 类型,因此该函数是这样实例化的。

从那开始,除了模板,现在你正在调用一个需要两个 directory_iterators 的函数:{} 只能 初始化一个 directory_iterator 在这一点上,因为这就是你的函数 [template instance] 所采用的。因此,在这种情况下,写 {} 在功能上等同于写 directory_iterator{}.

如果 directory_iterator 无法从 {} 构建,您的程序将无法编译。