|
[Rivet] Dangerous casting to FinalStateAndy Buckley andy.buckley at cern.chWed Jul 8 17:21:34 BST 2015
Sounds good to me. Should we *also* make the Projection() copy constructor private cf. operator=(), or dies that not achieve anything / cause other problems? I agree slicing and other gotchas are intrinsic to the nature of C++, but "the Rivet way" is to protect users from the need to know these things whenever that's possible without restricting useful functionality (a delicate balance...) AB On 8 Jul 2015 17:15, "Chris Pollard" <cpollard at cern.ch> wrote: > Hi all, > > David and I just had a quick chat about this, and I think I finally > understand what is going on here. David, please say something if I don't > summarize our discussion correctly... > > We both agree that the best thing to do is to have remainingFinalState() > return "const VetoedFinalState&", which is the actual type of the > underlying returned object. Currently it returns "const FinalState&". This > change *should* generate compile-time warnings when a user tries something > like > > FinalState fs = zfinder.remainingFinalState(); > > because fs is being copy-constructed from a more complex class. @Frank, I > think this will also make your attached broken example work as expected. > > The following will work correctly and, now that remainingFinalState() > returns the correct type, is hopefully what users will do if they > absolutely have to make a copy. > > VetoedFinalState vfs = zfinder.remainingFinalState(); > > David's opinion (and he's convinced me, too) is that object slicing is an > inherent "feature" of c++ that is going to be very difficult to work > around, so just being careful with return types is the right way to deal > with it. > > Please pipe in of course if you see any issue with this. > > Chris > > On Wed, Jul 8, 2015 at 9:27 AM, David Grellscheid < > david.grellscheid at durham.ac.uk> wrote: > >> The sequence >> >> Type label = foobar; >> >> always calls a copy constructor of Type, it _never_ calls operator=(). >> >> If the copy constructor Type(Type) is not user-defined, it will be >> created implicitly. >> >> In your case, a FinalState(const FinalState &) will be created and used >> as long as the result type of zfinder.remainingFinalState() is a >> descendant of FinalState. >> >> David >> >> >> On 08/07/15 09:14, Chris Pollard wrote: >> > but... going back to Frank's Example1: I don't see a >> > FinalState(Projection) constructor. Won't operator =(Projection) be >> > called in the first line of >> > >> > FinalState remainder = zfinder.remainingFinalState(); >> > addProjection(remainder, "RFS"); >> > >> > since no appropriate constructor exists? Or will some implicit copy >> > constructor be called not via operator=? >> > >> > Chris >> > >> > On Tue, Jul 7, 2015 at 9:52 PM, David Grellscheid >> > <david.grellscheid at durham.ac.uk <mailto:david.grellscheid at durham.ac.uk >> >> >> > wrote: >> > >> > Maybe the confusion comes from the fact that >> > >> > Foo a = 7; >> > >> > does not call operator=(), but calls the constructor Foo(int). It's >> > just a different way of writing a constructor. operator=() is only >> > called here: >> > >> > Foo a; >> > a = 7; >> > >> > I still haven't had a chance to look at it in detail, sorry! >> > >> > See you, >> > >> > David >> > >> > >> > >> > On 07/07/2015 21:49, Andy Buckley wrote: >> > >> > Hmm, I certainly implemented it hoping that code with copy >> > assignments (as >> > opposed to copy constructions, which should perhaps also be >> > banned to >> > forbid an alternative-syntax route to achieving the same >> > misguided goal) >> > would now fail to compile. I based that on some StackOverflow >> > reading since >> > I was short of time to make an explicit test case of my own. >> > >> > I was *hoping* (and convinced from that reading) that it would >> > not be legal >> > for a private virtual method on a base class to be overloaded as >> > public >> > (and certainly not *automatically*) on a derived class. It would >> > be a huge >> > pain if those operators need to be *explicitly* private'd on >> > every derived >> > Projection. >> > >> > Aaaaand back to holiday ;-) >> > AB >> > >> > >> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://www.hepforge.org/lists-archive/rivet/attachments/20150708/14a82d03/attachment.html>
More information about the Rivet mailing list |