Why does the first commented line compile correctly, whereas the second doesn’t?
Why can a be given itself as a constructor argument, but b can’t?
Aren’t the two doing the same thing?
class Foo { Foo &operator =(Foo const &); /* Disable assignment */ };
int main()
{
Foo a = a; // OK
Foo b(b); // error C2065: 'b' : undeclared identifier
}
Update
Since it seems like it’s compiler-dependent, it seems like the problem is more severe than I thought.
So I guess another part of the question is, is the following code valid or no?
It gives an error in GCC but Visual C++ executes it just fine.
int main()
{
int i = 0;
{ int *i(&i); }
return i;
}
In your first code, both declarations should compile. GCC is right there. Visual C++ Compiler has bug.
And in the second code, the inner declaration should not compile. GCC is right there too, and VC++ is wrong.
GCC is right in both cases.
A code like
int a=a+100;andint a(a+100);is fine from syntax point of view. They might invoke undefined behavior depending on whether they’re created in static storage duration or automatic storage duration.Please read the comments associated with each declaration above.
Note that variables with static storage duration is statically initialized to zero at compile time, and if they’ve initializer, then they’re dynamically initialized also at runtime. But variables of POD types with automatic storage duration are not statically initialized.
For more detail explanation on static initialization vs dynamic initialization, see this: