簡體   English   中英

為什么使用此全局`operator <<`無法編譯?

[英]Why does using this global `operator<<` fail to compile?

簡而言之,這是界面

#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<<編譯?

您僅對可變左值重載了運算符,因此prvalue(臨時值Graph().render(0) )不會綁定到它。

您可以將運算符重載更改為使用const引用(它將接受左值右值):

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

或者,您可以添加其他右值重載:

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

如有疑問,請采用第一種解決方案。 如果打印對象的字符串表示形式需要對其進行突變,那將非常令人驚訝。

Graph::render應該按值返回一個新的Render對象也很奇怪,但這是您的決定。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM