私人朋友运营商的代理类<<

时间:2013-03-27 10:43:52

标签: c++

所以昨天我问了这个问题private friend operator<< 关于如何让operator<<私有的课程。我得到了一个非常好的答案, 这完全符合我的意愿,但我还有一些其他问题。

首先,我不明白为什么代理类不必成为private_printable的朋友?我怎样才能从private_printable内访问operator<<的内部成员?

其次,在使用答案的代码时,我写了这个:

operator proxy () const { return *this; }

起初它对我来说似乎没关系,它甚至可以编译,但是当我运行它并且遇到了段错误时 我意识到我没有为代理类定义任何构造函数, 将private_printable作为参数,从而允许转换。 那么如何编译我的代码,甚至不给我任何警告呢?

然后我做的第三件事就是给代理一个带引用的构造函数 以private_printable为参数(我没有明确说明),而不是定义转换运算符。 现在一切都很顺利,除了可以再次呼叫operator<<private_printable。但我不确定,为什么会这样。 是因为ADL吗?我对它有一些模糊的理解,但我不是 确定其所有细节。无论如何,proxy类是私有的,为什么会这样 ADL有什么不同吗?

1 个答案:

答案 0 :(得分:1)

  1. operator<<可以访问private_printable的成员,因为它是friend private_printable。它不是friend的{​​{1}}。

  2. proxy返回return *this个对象,该对象必须隐式转换为private_printable。如何将proxy转换为private_printable?致电proxy。但这就是我们已经拥有的功能!段错误是由无限递归的堆栈溢出引起的。对于它的价值,无限循环将是另一种可能的结果。

  3. private_printable::operator proxy ()构造函数也是转换函数,其作用与explicit相同。 ADL涉及类似,就像使用operator proxy而没有构造函数一样。解决方案当然是制作构造函数operator proxy。只有当构造函数的唯一操作数是代理类时,才会出现问题。

  4. 作为explicit成员的proxy类仅在您明确命名时才有意义。 ADL仍然可以找到带有private参数的函数,然后间接导致访问转换函数,因为类类型的使用不受访问限定的影响。只有名称查找受到影响。同样,如果您只有proxy,则可以始终使用private成员类型。