为什么std :: endl的类型推导失败?

时间:2020-08-09 18:36:00

标签: c++ c++14 auto type-deduction

在以下代码中:

#include <iostream>

auto& print = std::cout; // Type deduction for std::cout works
auto& end = std::endl;   // But the std::endl is exception here

int main(void) {
  print << "Hello" << end;

  return 0;
}

std::cout的类型推导正确进行,但是为什么它不适用于std::endl

注意:删除对运算符(“&”号)的引用也不起作用。


VS代码说:

Type deduction error screenshot

编译器将生成以下内容:

$ g++ -Wall -O3 -std=c++14 -o main main.cpp; ./main

main.cpp:4:18: error: unable to deduce 'auto&' from 'std::endl'
    4 | auto& end = std::endl;    // But the std::endl is exception here
      |                  ^~~~
main.cpp:4:18: note:   couldn't deduce template parameter 'auto'

1 个答案:

答案 0 :(得分:7)

std::cout是具体类型std::ostream(又名std::basic_ostream<char>专业化)的对象,因此auto可以推断出其类型。

std::endl根本不是对象,它是模板函数(具体地说,是将模板化的std::basic_ostream对象作为参数的流操纵器):

template< class CharT, class Traits >
std::basic_ostream<CharT, Traits>& endl( std::basic_ostream<CharT, Traits>& os );

成为模板可以使std::endl处理不同字符类型(charwchar_t等不同字符类型(std::coutstd::wcout)的输出流,等

但是,您没有为模板参数提供任何值来告诉编译器您想要使用std::endl的哪种专业化,因此auto无法为其推断出具体的类型,因此错误。

您必须改为执行以下操作:

auto& end = std::endl<char, std::char_traits<char>>;

Live Demo