简而言之,这是界面
#includestruct 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<<
编译?
您已经为可变lvalues重载了运算符,因此prvalue(临时值Graph().render(0)
)不绑定它.
您可以更改运算符重载以使用const引用(它将接受左值和右值):
std::ostream & operator<<(std::ostream &, const Graph::Render &); // ^^^^^^^^^^^^^^^^^^^^^
或者您可以添加额外的右值超载:
std::ostream & operator<<(std::ostream &, Graph::Render &&); // ^^^^^^^^^^^^^^^^
如果有疑问,请使用第一个解决方案.如果打印对象的字符串表示将需要其突变,那将是非常令人惊讶的.
(按值Graph::render
返回新Render
对象也有点奇怪,但这是你的决定.)