C++ {}是传递给需要迭代器(表示某个容器的std::end()的函数的有效参数吗?
在(请参阅)中是示例代码C++ {}是传递给需要迭代器(表示某个容器的std::end()的函数的有效参数吗?,c++,c++11,boost,iterator,boost-iterators,C++,C++11,Boost,Iterator,Boost Iterators,在(请参阅)中是示例代码 #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), {})) { s
#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";
}
如果我是对的,那么上面代码示例中传递的第二个参数,{}
,似乎对应于目录迭代器
不可见地迭代的任何容器的末尾
我以前从未见过这种情况
通过从空初始值设定项列表中构造这样一个迭代器,是否可以构造end
迭代器?(我的措辞是否恰当?)
我不介意有人解释引擎盖下发生了什么,因为这样构造的迭代器的类型必须与第一个迭代器的类型匹配(
目录迭代器(p)
)。(这里正在进行模板参数推断吗?以下是各种重载:
template
迭代器\u范围
使迭代器成为范围(ForwardTraversalIterator Begin,
前向传输器端);
模板
迭代器\u范围
生成迭代器范围(ForwardRange&r);
模板
迭代器\u范围
生成迭代器范围(const ForwardRange&r);
模板<类别范围>
迭代器\u范围
生成迭代器范围(范围&r,
类型名称范围\差异::类型高级\开始,
类型名称范围(差异::类型前进(结束);
模板<类别范围>
迭代器\u范围
生成迭代器范围(常量范围&r,
类型名称范围\差异::类型高级\开始,
类型名称范围(差异::类型前进(结束);
因为您的代码已经指定第一个参数的类型为
目录迭代器
,第二个参数的唯一有效类型是目录迭代器
。它是明确的
因此,不需要指定类型
{}
与目录迭代器{}
同义,它也与目录迭代器()同义。
是的,它是有效的。
除了您通常调用的模板参数外,没有其他模板参数推导:您的第一个参数的类型是目录迭代器
,因此函数被实例化为这样的类型
在此基础上,撇开模板不谈,现在您正在调用一个需要两个目录迭代器
:此时{}
只能初始化一个目录迭代器
,因为您的函数[模板实例]就是这样做的。因此,在这种情况下,编写{}
在功能上等同于编写目录迭代器{}
如果无法从
{}
构造目录迭代器
,您的程序将无法编译。{}
将是目录迭代器{}
。某些迭代器类型在end
处使用默认的构造对象@Jarod42boost::make_iterator_range
知道第二个参数必须是directory_iterator
类型吗?想一想,从我复制到这个问题中的make_iterator_range
的定义来看,很明显它是这样的。值得注意的是,在VS2013中,如果没有一个显式的directory_iterator{}
作为参数,这段代码将无法构建-普通的{}
不会编译。啊,好吧。我相信C++11只使用普通的{}
是合法的。结合@Jarod42的注释,这将完成答案。谢谢
template< class ForwardTraversalIterator >
iterator_range< ForwardTraversalIterator >
make_iterator_range( ForwardTraversalIterator Begin,
ForwardTraversalIterator End );
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 );