language hipsters also have never used J, if they had they

External Content not shown. Further Information. Let's do a little C++! Let us explore the amazingly well-designed template system of C++.

Will the following code compile?

class NAT {};

class ZERO : public NAT {};

class FAIL {};

template <class C>
class SUCC : public NAT {
public:
  NAT* doWitnessing () {
    return (C*)(0xbad);
  }
  SUCC () {
    doWitnessing();
  }
};

int main (void) {
  (SUCC<SUCC<SUCC<ZERO> > > ());
}


Well, probably. But what about

class NAT {};

class ZERO : public NAT {};

class FAIL {};

template <class C>
class SUCC : public NAT {
public:
  NAT* doWitnessing () {
    return (C*)(0xbad);
  }
  SUCC () {
    doWitnessing();
  }
};

int main (void) {
  (SUCC<SUCC<SUCC<FAIL> > > ());
}


Well, hopefully not, will it? Hm. What about

class NAT {};

class ZERO : public NAT {};

class FAIL {};

template <class C>
class SUCC : public NAT {
public:
  NAT* doWitnessing () {
    return new C;
  }
  SUCC () {
    doWitnessing();
  }
};

int main (void) {
  (SUCC<SUCC<SUCC<FAIL> > > ());
}


Probably not. So how about

#include <cstdlib>
class NAT {};

class ZERO : public NAT {};

class FAIL {};

template <class C>
class SUCC : public NAT {
public:
  NAT* doWitnessing () {
    return (C*) random();
  }
  SUCC () {
    doWitnessing();
  }
};

int main (void) {
  (SUCC<SUCC<SUCC<ZERO> > > ());
}


Of course it compiles. Why shouldn't it. And so will

#include <cstdlib>
class NAT {};

class ZERO : public NAT {};

class FAIL {};

template <class C>
class SUCC : public NAT {
public:
  NAT* doWitnessing () {
    return (C*) random();
  }
  SUCC () {
    doWitnessing();
  }
};

int main (void) {
  (SUCC<SUCC<SUCC<FAIL> > > ());
}


maybe. Maybe not. How about

class NAT {};

class ZERO : public NAT {};

class FAIL {};

template <class C>
class SUCC : public NAT {
public:
  void doWitnessing () {
    if (false) NAT a = C();
  }
  SUCC () {
    doWitnessing();
  }
};

int main (void) {
  (SUCC<SUCC<SUCC<FAIL> > > ());
}


and furthermore, what about

class NAT {};

class ZERO : public NAT {};

class FAIL {};

template <class C>
class SUCC : public NAT {
public:
  void doWitnessing () {
    if (false) NAT a = C();
  }
  SUCC () {
    doWitnessing();
  }
};

int main (void) {
  (SUCC<SUCC<SUCC<ZERO> > > ());
}


Got that?