在以下代码中:
#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代码说:
编译器将生成以下内容:
$ 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'
答案 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
处理不同字符类型(char
与wchar_t
等不同字符类型(std::cout
,std::wcout
)的输出流,等
但是,您没有为模板参数提供任何值来告诉编译器您想要使用std::endl
的哪种专业化,因此auto
无法为其推断出具体的类型,因此错误。
您必须改为执行以下操作:
auto& end = std::endl<char, std::char_traits<char>>;