C++ 函数调用如何给出编译时类型? #包括 使用名称空间范围; 模板 标记双 f(I,O,O) { 返回{i,o}; } int main() { char-buf[8]{}; f(标准::开始(buf),标准::结束(buf)); }

C++ 函数调用如何给出编译时类型? #包括 使用名称空间范围; 模板 标记双 f(I,O,O) { 返回{i,o}; } int main() { char-buf[8]{}; f(标准::开始(buf),标准::结束(buf)); },c++,syntax,range,standards,c++17,C++,Syntax,Range,Standards,C++17,代码使用并且可以使用clang编译 但是,我无法理解为什么这一行标记的\u对是合法的I是一个类型,tag::in(I)也是一个类型,tag::in不是宏,tag::in(I)如何在编译时给出类型 另请参见它是一种接受I并返回tag::in的函数类型,也是一种类型 例如,在类似于std::function中使用 #include <range/v3/all.hpp> using namespace ranges; template<typename I, typename O

代码使用并且可以使用
clang
编译

但是,我无法理解为什么这一行
标记的\u对
是合法的
I
是一个类型,
tag::in(I)
也是一个类型,
tag::in
不是宏,
tag::in(I)
如何在编译时给出类型


另请参见

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

例如,在类似于
std::function
中使用

#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));
}