List, Aggregate, and Designated Initialization

List Initialization with constexpr and constinit

How does list initialization interact with constexpr and constinit specifiers in C++20?

Abstract art representing computer programming

List initialization works well with constexpr and constinit specifiers, enhancing compile-time evaluation and constant initialization in C++20.

These specifiers help ensure that variables are initialized at compile-time, leading to safer and more efficient code.

constexpr

The constexpr specifier indicates that the value of a variable or function can be evaluated at compile-time. You can use list initialization with constexpr to define compile-time constants:

#include <iostream>

struct Vec3 {
  int x, y, z;
};

constexpr Vec3 CreateVector(int a, int b, int c) {
  return {a, b, c};  
}

int main() {
  constexpr Vec3 vector = CreateVector(1, 2, 3);  
  std::cout << "x=" << vector.x
    << ", y=" << vector.y
    << ", z=" << vector.z;
}
x=1, y=2, z=3

In this example, the CreateVector function is constexpr, meaning it can be evaluated at compile-time. The vector variable is also constexpr, ensuring its value is determined during compilation.

constinit

The constinit specifier, introduced in C++20, guarantees that a variable is initialized at compile-time. Unlike constexpr, constinit can be used with non-constant expressions, as long as the initialization happens at compile-time:

#include <iostream>

struct Vec3 {
  int x, y, z;
};

constinit Vec3 vector = {1, 2, 3};  

int main() {
  std::cout << "x=" << vector.x
    << ", y=" << vector.y
    << ", z=" << vector.z;
}
x=1, y=2, z=3

Here, constinit ensures that vector is initialized at compile-time. If the initialization expression were not a constant expression, the code would not compile.

Combining constexpr and List Initialization

You can combine constexpr with list initialization to create complex compile-time constants:

#include <iostream>

struct Vec3 {
  int x, y, z;
};

struct Transform {
  Vec3 position;
  Vec3 rotation;
  Vec3 scale;
};

constexpr Transform CreateTransform() {
  return {{0, 0, 0}, {0, 0, 0}, {1, 1, 1}};  
}

int main() {
  constexpr Transform transform = CreateTransform();
  std::cout
    << "Position: x=" << transform.position.x
    << ", y=" << transform.position.y
    << ", z=" << transform.position.z;
}
Position: x=0, y=0, z=0

This example demonstrates a Transform structure initialized using list initialization within a constexpr function. The resulting transform variable is a compile-time constant.

In summary, list initialization interacts seamlessly with constexpr and constinit, enabling efficient and safe compile-time initialization of variables and constants.

Using these specifiers, you can ensure that your variables are initialized correctly and efficiently, leveraging the full power of compile-time evaluation in C++20.

This Question is from the Lesson:

List, Aggregate, and Designated Initialization

A quick guide to creating objects using lists, including std::initializer_list, aggregate and designated initialization

Answers to questions are automatically generated and may not have been reviewed.

This Question is from the Lesson:

List, Aggregate, and Designated Initialization

A quick guide to creating objects using lists, including std::initializer_list, aggregate and designated initialization

A computer programmer
Part of the course:

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Free, unlimited access

This course includes:

  • 125 Lessons
  • 550+ Code Samples
  • 96% Positive Reviews
  • Regularly Updated
  • Help and FAQ
Free, Unlimited Access

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Screenshot from Warhammer: Total War
Screenshot from Tomb Raider
Screenshot from Jedi: Fallen Order
Contact|Privacy Policy|Terms of Use
Copyright © 2024 - All Rights Reserved