为什么一个ostream iomanip传递给operator<<时不需要模板参数?

问题描述 投票:2回答:1

在命名空间 std 中,gnu stdc++ 头文件 ostream 中,这是 std::endl 的定义。

template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    endl(basic_ostream<_CharT, _Traits>& __os)
    { return flush(__os.put(__os.widen('\n'))); }

为什么可以写 std::cout << std::endl; 哪儿 endl 是在没有模板参数的情况下使用的?

c++ templates iostream
1个回答
3
投票

std::basic_ostream<CharT,Traits>::operator<< 以操纵器作为函数指针。模板参数推导 当被传递给模板时,如 std::endl因此模板参数不需要显式指定。

在可能的情况下,编译器会从函数参数中推断出缺少的模板参数。这发生在尝试调用函数和获取函数模板地址的时候。

这种机制使得使用模板操作符成为可能,因为除了将操作符重新写成函数调用表达式之外,没有任何语法可以为其指定模板参数。

#include <iostream>
int main() 
{
    std::cout << "Hello, world" << std::endl;
    // operator<< is looked up via ADL as std::operator<<,
    // then deduced to operator<<<char, std::char_traits<char>> both times
    // std::endl is deduced to &std::endl<char, std::char_traits<char>>
}

给定 std::cout << std::endl;,参数类型为相应的 operator<<std::basic_ostream<char,std::char_traits<char>>& (*func)(std::basic_ostream<char,std::char_traits<char>>&)的模板参数,那么 std::endl 将被推断为 charstd::char_traits<char>.

© www.soinside.com 2019 - 2024. All rights reserved.