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
处使用默认的构造对象@Jarod42
boost::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 );