gpt4 book ai didi

c++ - "std::cout << std::endl;"如何编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:41 27 4
gpt4 key购买 nike

大多数IO stream manipulators是具有以下签名的常规函数​​:

std::ios_base& func( std::ios_base& str );

但是一些操纵符(包括最常用的操纵符 - std::endl std::flush )是以下形式的模板:

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

那么,std::cout << std::endl;是如何编译的呢?如果以下示例失败,则成功:

$ cat main.cpp 
#include <iostream>

int main()
{
auto myendl = std::endl;
std::cout << myendl;
}

$ g++ -std=c++11 main.cpp -o main
main.cpp: In function ‘int main()’:
main.cpp:5:24: error: unable to deduce ‘auto’ from ‘std::endl’
auto myendl = std::endl;
^

很明显,上下文(在 std::cout << std::endl; 中)帮助编译器消除对 std::endl 的引用的歧义。 .但是管理该程序的规则是什么?对于重载解析来说,这看起来是一个真正的挑战,它必须同时回答两个问题:

  1. 哪个专业std::endl<CharT, Traits>()std::endl引用?
  2. operator<< 是哪个函数?引用?

模板参数推导 (1) 应该在重载决议 (2) 之前发生,但似乎需要执行 (2) 的(至少部分)才能使 (1) 成功。


有些相关但绝不重复的问题是:

这些问题和对它们的回答都没有解决应该在重载决议之前但必须由后者帮助的模板参数推导的工作原理。


跟进问题: How does overload resolution work when an argument is an overloaded function?

最佳答案

operator<<有问题的是 std::basic_ostream成员 :

namespace std {
template <class charT, class traits = char_traits<charT> >
class basic_ostream {
public:
basic_ostream<charT,traits>& operator<<(
basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&));
// ...
};
}

因为电话是 std::cout << std::endl , 或等同于 std::cout.operator<<(std::endl) ,我们已经知道了 basic_ostream 的确切实例化: std::basic_ostream<char, std::char_traits<char>> , 又名 std::ostream .所以cout的成员函数看起来像

std::ostream& operator<<(std::basic_ostream<char, std::char_traits<char>>& (*pf)
(std::basic_ostream<char, std::char_traits<char>>&));

这个成员函数不是函数模板,只是一个普通的成员函数。所以剩下的问题是,它可以用名称 std::endl 来调用吗?作为论据?是的,初始化函数参数相当于一个变量初始化,就像我们写的一样

std::basic_ostream<char, std::char_traits<char>>& (*pf)
(std::basic_ostream<char, std::char_traits<char>>&) = std::endl;

关于c++ - "std::cout << std::endl;"如何编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41376837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com