Question: I have some old C++ code that creates a std::vector containing two NUL wchar_ts:
std::vector<wchar_t> v(2, L'\0');
This code works just fine. I tried to modernize it, using C++11’s brace-initialization syntax:
// Braces {} used instead of parentheses () // to initialize v std::vector<wchar_t> v{2, L'\0'};
However, now I have a bug in my new C++ code! In fact, the brace-initialized vector now contains a wchar_t having code 2, and a NUL. But I wanted two NULs! What’s wrong with my code?
Answer: The problem is that the new C++11 brace initialization syntax (more precisely: “direct-list-initialization”) in this vector case stomps (prevails) on the initialize-with-N-copies-of-X constructor overload that was used in the original code. So, the vector gets initialized with the content of the braced initialization list: {2, L’\0’}, i.e. a wchar_t having code 2, and a NUL.
I’m sorry: to get the expected original behavior you have to stick with the classical C++98 parentheses initialization syntax.