Question

I just found that when it comes to templates this code compiles in g++ 3.4.2 and works unless m() is not called:

template <typename T>
class C
{
     T e;

     public:
        C(): e(0) {};

    void m()
    {
        e = 0;
    };
 };

Now one may create and use instance

C<const int> c;

Until c.m() is not called there are no compile errors but is this legal?

Was it helpful?

Solution

Yes, this is legal. The template specification is that until a method is instantiated, it doesn't exist and therefor is not checked by the compiler. Here's the relevant bit from the spec:

14.7.1 - Implicit instantiation

-9- An implementation shall not implicitly instantiate a function template, a member template, a non-virtual member function, a member class or a static data member of a class template that does not require instantiation.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top