Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does the GotW #101 "solution" actually solve anything?

Tags:

First read Herb's Sutters GotW posts concerning pimpl in C++11:

  • GotW #100: Compilation Firewalls (Difficulty: 6/10)

  • GotW #101: Compilation Firewalls, Part 2 (Difficulty: 8/10)

I'm having some trouble understanding the solution proposed in GotW #101. As far as I can understand, all the problems laboriously solved in GotW #100 are back with a vengeance:

  • The pimpl members are out-of-line templates, and the definitions are not visible at the point of use (in class widget's class definition and implicitly generated special member functions of widget). There aren't any explicit instantiations either. This will cause unresolved external errors during linking.

  • widget::impl is still incomplete at the point where pimpl<widget::impl>::~pimpl() is instantiated defined (I don't think it actually IS instantiated at all, just referenced). So std::unique_ptr<widget::impl>::~unique_ptr() calls delete on a pointer to incomplete type, which produces undefined behavior if widget::impl has a non-trivial destructor.

Please explain what forces the compiler to generate the special members in a context where widget::impl is complete. Because I can't see how this works.


If GotW #101 still requires explicit definition of widget::~widget() in the implementation file, where widget::impl is complete, then please explain the "More Robust" comment (which @sehe quoted in his answer).

I'm looking at the core claim of GotW #101 that the wrapper "eliminates some pieces of boilerplate", which seems to me (based on the remainder of the paragraph) to mean the widget::~widget() declaration and definition. So please don't rely on that in your answer, in GotW #101, that's gone!


Herb, if you stop by, please let me know if it would be ok to cut+paste the solution code here for reference.

like image 624
Ben Voigt Avatar asked Dec 21 '11 19:12

Ben Voigt


People also ask

What does Gotw mean in football?

1. GOTW. Goal of the Week. Goal, Sport, League.

What is Gotw?

Guru of the Week (GotW) is a series of C++ programming problems created and written by Herb Sutter.


1 Answers

You are correct; the example seems to be missing an explicit template instantiation. When I try to run the example with a constructor and destructor for widget::impl on MSVC 2010 SP1, I get a linker error for pimpl<widget::impl>::pimpl() and pimpl<widget::impl>::~pimpl(). When I add template class pimpl<widget::impl>;, it links fine.

In other words, GotW #101 eliminates all boilerplate from GotW #100, but you need to add an explicit instantiation of the pimpl<...> template with the implementation of the pimpl impl. At least with #101 the boiler plate you need is straightforward.

like image 91
MSN Avatar answered Nov 23 '22 09:11

MSN