Home > Backend Development > C++ > Why Is Aggregate Initialization No Longer Allowed for Structs with Explicitly Defaulted or Deleted Constructors in C 20?

Why Is Aggregate Initialization No Longer Allowed for Structs with Explicitly Defaulted or Deleted Constructors in C 20?

Patricia Arquette
Release: 2024-11-03 08:29:30
Original
736 people have browsed it

Why Is Aggregate Initialization No Longer Allowed for Structs with Explicitly Defaulted or Deleted Constructors in C  20?

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!
}
Copy after login

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template