gpt4 book ai didi

c++ - C++程序如何为插入(<<)运算符选择正确的函数?

转载 作者:行者123 更新时间:2023-12-02 09:55:25 24 4
gpt4 key购买 nike

在C++中,常见的教训之一是在创建自己的类型时如何重载插入运算符(<<)。我们被告知创建一个名为operator<<的全局函数,该函数具有两个参数,一个ostream ref和我们的类型,并返回一个ostream ref。

std::ostream& operator<<(std::ostream& os, const MyType& mt) {
...
}

现在,当您了解可以将运算符显式调用为函数时,这很有意义。例如,这对语句在功能上是等效的:
MyType mt;

std::cout << mt;
operator<<(std::cout, mt);

但是,有趣的是插入对于内置类型的工作方式。让我们考虑一下字符串,整数甚至 std::endl(直到最近 I assumed was a type)
std::cout << "Hello world";
operator<<(std::cout, "Hello world"); // fine

std::cout << 5;
operator<<(std::cout, 5); // ERROR!

std::cout << std::endl;
operator<<(std::cout, std::endl); // ERROR!

有一个全局运算符<<为字符串(char数组)定义,但没有为ints或 std::endl定义。如果要显式插入这些类型,则必须做一些不同的事情(顺便说一下,这不适用于字符串)。
std::cout << "Hello world";
std::cout.operator<<("Hello world"); // ERROR!

std::cout << 5;
std::cout.operator<<(5); // fine

std::cout << std::endl;
std::cout.operator<<(std::endl); // fine
std::endl(std::cout); // also equivalent

整数处理被定义为ostream上的成员函数,而 std::endl实际上是利用ostream上的函数模板的函数。

所以我的问题是,在为插入运算符转换语法糖时,C++编译如何最终选择正确的函数?当开发人员编写以下内容时,如何正确查找并映射到适当的功能地址?
std::cout << "Id: " << 5 << std::endl;

最佳答案

当使用cout << ...(或任何其他ostream)时,编译器会在流类中同时查找一个名为operator<<()的成员方法,并在第一个参数中同时使用一个名为operator<<()的非成员函数(将流类作为参数),并且如果存在多个匹配项,则overload resolution根据传递给运算符的另一个值,找出哪个匹配是最好的调用。

有关更多详细信息,请参见operator overloading上的cppreference.com,尤其是“重载的运算符”部分。

关于c++ - C++程序如何为插入(<<)运算符选择正确的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60553732/

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