Aggregate Initialization in C 20
In C 20, aggregate initialization for structs that have explicitly defaulted or deleted constructors has undergone a significant change. This alteration affects code that was previously valid but now generates errors.
Pre-C 20 Compatibility
Before C 20, aggregate initialization was allowed for structs that possessed user-provided, inherited, or explicitly defaulted or deleted constructors. This permitted the bypass of constructors during initialization.
C 20 Standards
However, the C 20 standard has revised this behavior. Aggregate initialization is now permitted only for structs that lack user-declared or inherited constructors. Explicitly defaulted or deleted constructors are no longer allowed. This change was implemented to address ambiguity and confusion in initialization semantics.
Rationale for the Change
The rationale behind this change in C standards is rooted in the desire to enhance the safety, uniformity, and clarity ofinitialization. The previous behavior could lead to unexpected and erroneous code, as illustrated by:
struct X { int i{4}; X() = default; }; int main() { X x1(3); // ill-formed - no matching c’tor X x2{3}; // compiles! }
In this example, the default constructor of X cannot be used for initialization due to the declaration of the member variable i with an initial value of 4. However, aggregate initialization is erroneously permitted, leading to ambiguous and potentially incorrect behavior.
Implications for Code
This change necessitates code modifications for cases where aggregate initialization was previously used with explicitly defaulted or deleted constructors. It prompts developers to reconsider the practice of explicitly defaulting constructors for aggregate data types.
In conclusion, the C 20 standard change regarding aggregate initialization aims to improve the reliability and consistency of initialization idioms, justifying the potential backwards-incompatibility it introduces.
The above is the detailed content of Why Is Aggregate Initialization No Longer Allowed for Structs with Explicitly Defaulted or Deleted Constructors in C 20?. For more information, please follow other related articles on the PHP Chinese website!