函数调用如何给出编译时类型?

How does a function call give a compile-time type?

#include <range/v3/all.hpp>

using namespace ranges;

template<typename I, typename O>
tagged_pair<tag::in(I), tag::out(O)>
f(I i, O o)
{
    return { i, o };
}

int main()
{
    char buf[8]{};
    f(std::begin(buf), std::end(buf));
}

代码使用range-v3,可以用clang编译。

但是,我不明白为什么tagged_pair<tag::in(I), tag::out(O)>行是合法的。 I是类型,tag::in(I)也是类型,tag::in不是宏,tag::in(I)如何在编译时给出类型?

另见 http://en.cppreference.com/w/cpp/experimental/ranges/algorithm/copy

是接受I返回tag::in的函数类型,也是一种类型

这个是用的,比如在std::function,比如std::function<void(int)>.