1 // N3323
2 
3 #define assert(E) if(!(E))__builtin_abort();
4 
5 template<class T>
6 class zero_init
7 {
8 public:
zero_init()9   zero_init( )
10     : val( static_cast<T>(0) ) { }
zero_init(T val)11   zero_init( T val ) : val( val )
12   { }
13   operator T & ( ) { return val; }
T()14   operator T ( ) const { return val; }
15 private:
16   T val;
17 };
18 
f()19 void f()
20 {
21   zero_init<int*> p; assert( p == 0 );
22   p = new int(7);
23   assert( *p == 7 );
24   delete p; // error!
25 
26   zero_init<int> i; assert( i == 0 );
27   i = 7;
28   assert( i == 7 );
29   switch( i ) {  } // error!
30 
31   int *vp = new int[i];
32 }
33