C 11 Aggregate Initialization for Classes with Non-Static Member Initializers
The use of in-class member initializers can significantly impact class behavior in C . Specifically, it raises the question of whether a class remains an aggregate under these circumstances.
In C 11, in-class member initializers introduce a significant restriction: they prohibit the classification of a class or struct as an aggregate. This is evident in the draft C 11 standard, which defines an aggregate as "a class with no user-provided constructors, no brace-or-equal initializers for non-static data members, no private or protected non-static data members, no base classes, and no virtual functions." By introducing in-class initializers, a class becomes similar to a user-defined constructor, losing its aggregate status.
However, this restriction was lifted in C 14. Member initializers no longer prevent a class from being considered an aggregate, as the standard has been revised to remove this limitation. This change is detailed in N3605, which proposed removing the restriction against aggregates having member-initializers.
The rationale for this change stemmed from the recognition that member initializers are not equivalent to user-defined constructors. While they share some similarities, member initializers are more closely aligned with the concept of aggregate initialization, which is intended to be a lightweight and efficient way to initialize objects.
In conclusion, in C 11, in-class member initializers disqualified a class from aggregate status, but this limitation was removed in C 14, allowing for greater flexibility in class initialization.
The above is the detailed content of Is a Class with In-Class Member Initializers Still an Aggregate in C ?. For more information, please follow other related articles on the PHP Chinese website!