C++ 为什么要实例化流运算符的模板而不是全局重载运算符?

C++ 为什么要实例化流运算符的模板而不是全局重载运算符?,c++,operator-overloading,C++,Operator Overloading,假设有以下代码。有一个类MyStream witch具有模板重载运算符 它首先调用传递int()的成员函数,成员函数返回类型为MyStream&的对象,该对象现在可以作为第一个参数传递给free函数(因为它是no更多的右值,它现在是左值),然后调用free函数,将类型为MyStream&的对象作为第一个参数传递,并将MyClass()作为第二个参数传递 这很有趣,这里也发生了类似的事情: 我明白了。谢谢你的澄清。问得好!简短的代码和清晰的问题陈述。我希望这里所有的问题都能像这一个一样清楚地表

假设有以下代码。有一个类MyStream witch具有模板重载运算符 它首先调用传递
int()
的成员函数,成员函数返回类型为
MyStream&
的对象,该对象现在可以作为第一个参数传递给free函数(因为它是no更多的右值,它现在是左值),然后调用free函数,将类型为
MyStream&
的对象作为第一个参数传递,并将
MyClass()作为第二个参数传递

这很有趣,这里也发生了类似的事情:


我明白了。谢谢你的澄清。问得好!简短的代码和清晰的问题陈述。我希望这里所有的问题都能像这一个一样清楚地表达出来!
#include <iostream>

class MyStream;
class MyClass;
MyStream& operator << (MyStream& stream, const MyClass&);

class MyStream
{
public:
    template <typename T>
    MyStream& operator << (const T&)
    {
        std::cout << __FUNCTION__ << " " << typeid(T).name() << std::endl;
        return *this;
    }
};

class MyClass
{
};

MyStream& operator << (MyStream& stream, const MyClass&)
{
    std::cout << __FUNCTION__ << " " << typeid(MyClass).name() << std::endl;
    return stream;
}

int main(int, char**)
{
    // 1. Used globally defined operator for MyClass
    MyStream() << int() << MyClass();
    std::cout << std::endl;

    // 2. Template instantiation
    MyStream() << MyClass();

    std::cin.get();
    return 0;
}
MyStream::operator << int
operator << class MyClass

MyStream::operator << class MyClass
// 2. Template instantiation
 MyStream() << MyClass();
// 1. Used globally defined operator for MyClass
MyStream() << int() << MyClass();