On Saturday, December 22, 2012 00:21:33 Walter Bright wrote:
> On 12/21/2012 11:23 PM, Jonathan M Davis wrote:
> > But we _want_ that. The fact that inaccessible functions are even
> > considered in overload sets is horrible. That's precisely the problem. No
> > inaccessible functions should be in overload sets. Otherwise, simply
> > adding a private function to a module can break code elsewhere. I don't
> > see _any_ benefit in having inaccessible functions be in overload sets.
> > It's leaking implementation details outside of the scope that they're in
> > and breaking code elsewhere when changes are made. What do you think is
> > so desirable about having inaccessible functions in overload sets?
> 
> It's that way in C++ mainly so that it doesn't make the already complex
> overloading system even more so. And in 25 years of working with C++, I've
> never seen this make anyone's list of horrible things about C++.

C++ doesn't have module-level access modifiers or UFCS, so it's completely 
unaffected by this. In C++, you can't add functions to classes from the 
outside, so there's no concern about adding private functions to a class 
breaking code using that class. And you can't add a private function to a 
module, because there are neither modules nor private, free functions, so you 
aren't going to get breakage from adding a private function, because you can't 
add a private function. Either you add what is effectively a public function 
(though technically, it has no access modifier at all, since it's not part of a 
class) and risk breakage that way, or you create a function which is only in 
the cpp file. In D, on the other hand, you can add private functions to 
modules, and you don't normally have separate implementation files. So, the 
situation is completely different.

We created this problem by adding modules and making it so that that the 
functions in them have access levels. We have extra layers of encapsulation 
which just don't exist in C++, and we made them leaky, because we made it so 
that the private functions affect overload sets. So, the fac that C++ doesn't 
get these complaints is pretty much irrelevant. It doesn't have the features 
which make this a problem. And regardless of whether you get complaints about 
this in C++, there have been plenty of complaints around here about it in D.

Pretty much every time that this issue comes up, people are surprised by the 
fact that private symbols aren't hidden and pretty much no one wants them to 
be in overload sets. I think that you're the only one that I've seen post that 
they thought that the current behavior is a good idea (certainly, anyone who 
agrees with you is in the minority or is silent on the issue). What we 
currently have leaks implementation detalis and thus causes code breakage when 
the implementation is changed. It needs to be fixed.

- Jonathan M Davis

Reply via email to