The table summarizes how brackets {} and () are related to list-initialization in various contexts. The column Allows Narrowing Conversion indicates whether implicit type conversions that lose information are allowed. The column Allows Explicit Constructors indicates whether the syntax can call constructors marked as explicit. The columns Use for Aggregates and Use for User-Defined Types show the applicability of each initialization type for aggregates like arrays (e.g., int x[3][4]) and structs, and user-defined types like classes, respectively.

Initialization TypeSyntaxAllows Narrowing ConversionAllows Explicit ConstructorsUse for AggregatesUse for User-Defined TypesRemarks
Direct Initialization (())int a(42);YesNoNoYesTraditional C++ syntax
Direct-list-initializationint a{42};NoYesYesYesC++11 onwards; type-safe
Copy Initialization (=)int a = 42;YesNoNoYesTraditional C++ syntax
Copy-list-initializationint a = {42};NoNoYesYesC++11 onwards; type-safe