[英]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.