所以昨天我问了这个问题private friend operator<<
关于如何让operator<<
私有的课程。我得到了一个非常好的答案,
这完全符合我的意愿,但我还有一些其他问题。
首先,我不明白为什么代理类不必成为private_printable
的朋友?我怎样才能从private_printable
内访问operator<<
的内部成员?
其次,在使用答案的代码时,我写了这个:
operator proxy () const { return *this; }
起初它对我来说似乎没关系,它甚至可以编译,但是当我运行它并且遇到了段错误时
我意识到我没有为代理类定义任何构造函数,
将private_printable
作为参数,从而允许转换。
那么如何编译我的代码,甚至不给我任何警告呢?
然后我做的第三件事就是给代理一个带引用的构造函数
以private_printable
为参数(我没有明确说明),而不是定义转换运算符。
现在一切都很顺利,除了可以再次呼叫operator<<
在private_printable
。但我不确定,为什么会这样。
是因为ADL吗?我对它有一些模糊的理解,但我不是
确定其所有细节。无论如何,proxy
类是私有的,为什么会这样
ADL有什么不同吗?
答案 0 :(得分:1)
operator<<
可以访问private_printable
的成员,因为它是friend
private_printable
。它不是friend
的{{1}}。
proxy
返回return *this
个对象,该对象必须隐式转换为private_printable
。如何将proxy
转换为private_printable
?致电proxy
。但这就是我们已经拥有的功能!段错误是由无限递归的堆栈溢出引起的。对于它的价值,无限循环将是另一种可能的结果。
非private_printable::operator proxy ()
构造函数也是转换函数,其作用与explicit
相同。 ADL涉及类似,就像使用operator proxy
而没有构造函数一样。解决方案当然是制作构造函数operator proxy
。只有当构造函数的唯一操作数是代理类时,才会出现问题。
作为explicit
成员的proxy
类仅在您明确命名时才有意义。 ADL仍然可以找到带有private
参数的函数,然后间接导致访问转换函数,因为类类型的使用不受访问限定的影响。只有名称查找受到影响。同样,如果您只有proxy
,则可以始终使用private
成员类型。