所以昨天我问了这个问题私人朋友运营商<<
关于如何operator<<
为班级设为私人。我得到了一个很好的答案,它完全按照我的意愿工作,但我还有一些其他问题。
首先,我不明白代理类为什么不必成为朋友private_printable
?我怎么可能private_printable
从内部访问内部成员operator<<
?
其次,在使用答案中的代码时,我写了这个:
operator proxy () const { return *this; }
起初它对我来说似乎没问题,它甚至可以编译,但是当我运行它并得到一个段错误时,我意识到我没有为代理类定义任何构造函数,它将private_printable
作为参数并因此允许转换。那么我的代码怎么可能编译,甚至没有给我任何警告?
然后我做的第三件事是给代理一个构造函数,它有一个引用private_printable
作为它的参数(我没有让它显式),而不是定义转换运算符。现在一切都很好,只是又可以打电话operator<<
了private_printable
。但我不太确定,为什么会这样。是因为 ADL 吗?我对它有一些模糊的理解,但我不确定它的所有细节。无论如何,这proxy
门课是私人的,那么为什么 ADL 会有所作为呢?