The problems with uniform initialization
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.