C++11 made the {} syntax for initializing aggregates more widely usable. You can now also use it to call constructors and to initialize with a std::initializer_list. It also allows you to drop the type name in some circumstances. The general recommendation seems to be that you use it as much as possible. But when I have started doing that I have found that it sometimes doesn’t do what I want, and that it may make maintenance more difficult.
Here’s what it looks like:
#include <iostream>
struct Widget
{
Widget(int m) : m{m} {}
operator int() const { return m; }
int m;
};
Widget decrement_widget(Widget w)
{
return { w - 1 };
}
int main()
{
int a{1};
std::cout << a << std::endl; // "1"
Widget w{5};
std::cout << w << std::endl; // "5"
std::cout << decrement_widget({5}) << std::endl; // "4"
}
It can be used to initialize everything (hence the name uniform initialization) and as you can see it makes some code more convenient because I don’t even need the name any more if the compiler should know it.
It makes your code look a bit weird at first because you have squiggly braces everywhere, but after a while I found that I prefer it because it sets initialization apart from function calls.
But I have stopped using it and I recommend that you don’t use it either.
Read the rest of this entry »