{} 是传递给需要迭代器的函数的有效参数(代表某个容器的 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
无法从 {}
构建,您的程序将无法编译。
在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
无法从 {}
构建,您的程序将无法编译。