C++ Constructor initialization list strangeness
c++, constructor, initialization-list
Solution
Yes, it's valid. The names in the member initializer list are looked up in the context of the constructor's class so `int1` finds the name of member variable.
The initializer expression is looked up in the context of the constructor itself so `int1` finds the parameter which masks the member variables.
Problem
I have always been a good boy when writing my classes, prefixing all member variables with m_: ``` class Test { int m_int1; int m_int2; public: Test(int int1, int int2) : m_int1(int1), m_int2(int2) {} }; int main() { Test t(10, 20); // Just an example } ``` However, recently I forgot to do that and ended up writing: ``` class Test { int int1; int int2; public: // Very questionable, but of course I meant to assign ::int1 to this->int1! Test(int int1, int int2) : int1(int1), int2(int2) {} }; ``` Believe it or not, the code compiled with no errors/warnings and the assignments took place correctly! It was only when doing the final check before checking in my code when I realised what I had done. My question is: why did my code compile? Is something like that allowed in the C++ standard, or is it simply a case of the compiler being clever? In case you were wondering, I was using Visual Studio 2008