为什么使用这个全局`运算符<<`无法编译?

时间:2015-12-05 23:03:45

标签: c++

简而言之,这是界面

#include <iostream>

struct Graph
{
    typedef int Parameter;

    struct Render
    {
        void to (std :: ostream &) {}
    };

    Render render (Parameter) {}
};

std :: ostream &
operator << (std :: ostream &, Graph :: Render &);

int main ()
{
    Graph () .render (0) .to (std :: cout);

    // std :: cout << Graph () .render (0);
}

除非您取消注释最后一行,否则上述内容将无需投诉进行编译。

为什么全局operator<<不能编译?

1 个答案:

答案 0 :(得分:8)

您的运算符仅为可变左值重载,因此prvalue(Graph().render(0)的临时值)不会绑定它。

您可以更改运算符重载以使用const引用(它将接受左值 rvalues):

std::ostream & operator<<(std::ostream &, const Graph::Render &);
//                                        ^^^^^^^^^^^^^^^^^^^^^

或者您可以添加额外的右值超载:

std::ostream & operator<<(std::ostream &, Graph::Render &&);
//                                        ^^^^^^^^^^^^^^^^

如果有疑问,请使用第一个解决方案。如果打印对象的字符串表示需要其变异,那将是非常令人惊讶的。

Graph::render按值返回新的Render对象也有点奇怪,但这是你的决定。)