I have this source file:

```
#include <ctime>

class A
{
  public:
    A(unsigned long i){};
    A(const tm*){};
};

int main(int argc, char** argv)
{
  A tit(1);
  A tat(0);
  return 0;
}

```

When I compile this using gcc 3.4.2 I get the following:

> 
> autoCast.cpp: In function `int main(int, char**)':  
> 
>  autoCast.cpp:13: error: call of overloaded`A(int)' is ambiguous  
> 
>  autoCast.cpp:4: note: candidates are: A::A(const A&)  
> 
>  autoCast.cpp:7: note: A::A(const tm\*)  
> 
>  autoCast.cpp:6: note: A::A(long unsigned int) 
> 
> 
> 

My question is: why does the creation of `A tit(1)` (line 12) succeed while `A tat(0)` (line 13) fails? I tried different argument types in those lines (e.g. 0ULL and 1ULL) but it always fails when the argument value is 0, while it succeeds when the argument value is 1. The only 0 value for which no error is raised is 0UL (because no conversion is needed I guess). Why in this case does an integer with value 0 get different treatment from an integer with value 1? Does it have to do with the tm struct defined in time.h?