Subject: Re: [boost] [Hana] Informal review request
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2015-03-05 15:39:48
On 03/05/2015 01:15 PM, Matt Calabrese wrote:
> <snip>What this implies is that simply by writing
> pointer == tuple_t<Car*,...>, the effect is that the type "Car" is
> implicitly instantiated at this point (if it were template instantiation),
> because the compiler needs to see if there are base classes in order to
> properly form the set of associated namespaces!
> In this particular example it might not be too apparent why this is so bad,
> but in the general case, instantiating such types that are involved can
> cause a number of serious issues:
> 1) Perhaps the most obvious is that instantiation can potentially fail (and
> therefore cause a compile error even though it doesn't look like the type
> would be used).
I'm glad you brought this up. This problem
is not academic. I've seen real bugs reported
against at least one Boost library because
of something like this.
> 2) They can cause considerable compile-time overhead for a template
> definition's instantiation that otherwise might not be used.
> 3) Worst case, but probably the least likely. It can compile but produce
> strange results in the program in a very subtle way, not even necessarily
> directly at this point in code, due to the type being instantiated
> "prematurely" with respect to what the user may have expected. This can can
> cause problems, for instance, if certain types are still incomplete at this
> point in the translation unit, or if important functions/overloads have not
> yet been declared, etc. Because of memoization, at the point that the user
> thinks they are first instantiating the template, they will get an
> instantiation that they likely did not expect.