Re: Why is static member initialization inconsistent?
on Wed Jan 04 2012, Gene Bushuyev <publicfilter-AT-gbresearch.com> wrote:
It's a very fundamental rule that members of a template are not
implicitly instantiated until they are used. That reduces the
compilation time, size of libraries, cuts on dependencies, and makes
sfinae possible.
I don't think this has anything to do with SFINAE, which applies to
ordinary function templates that aren't class members. You may be
thinking of the a similar advantage: it's easy to make class templates
with optional features that are supported depending on details of the
template parameters. For example, if T is LessThanComparable, you can
call std::list<T>::sort without arguments.
l.sort()
This overload of std::list<T>::sort() contains code
that evaluates
x < y
where x and y are of type T.
If the overload of list<T>::sort that takes no arguments was eagerly
instantiated, list<T> would not be usable at all with a T that isn't
LessThanComparable:
struct X {};
std::list<X> l; // <== compilation would fail in sort()
Since list<T>::sort is instantiated only when used, we can make a
list<X>, and we're fine as long as we don't try to sort it.
--
Dave Abrahams
BoostPro Computing
http://www.boostpro.com
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]