I’m surprised there were no snarky comments about:<p>> So, here’s the glue between list-initialization and aggregate initialization: if list-initialization is performed on an aggregate, aggregate initialization is performed <i>unless</i> the list has only one argument, of type T or of type derived from T, in which case it performs direct-initialization (or copy-initialization).<p>The word “unless” is even bold.<p>We have fancy syntax:<p><pre><code> T t{v0};
</code></pre>
And we also have:<p><pre><code> T t{v0, v1};
</code></pre>
And so on. But the one-element case does not reliably work like the 2+-element case. And this is in a language that increasingly works toward making it straightforward to create a struct from a parameter pack and has support for variable length array-ish things that one can initialize like this. And the types can, of course, be templated.<p>So you can write your own constructors, and you can initialize a tuple or array with only one element supplied, and you might trip over the <i>wrong</i> constructor being invoked in special cases.<p>I remember discovering this when C++11 initializer lists were brand new and thinking it was nuts.