Mogą one przechować wyniki wyrażeń stałych lub stałowyrażeniowych konstruktorów (czyli zdefiniowanych ze słowem kluczowym constexpr).

W celu konstrukcji wartości stałowyrażeniowych z typów danych zdefiniowanych przez użytkownika, konstruktory muszą także być zadeklarowane jako constexpr. Taki stałowyrażeniowy konstruktor musi być zdefiniowany przed użyciem w jednostce translacyjnej; podobnie jest z metodami stałowyrażeniowymi. Muszą mieć puste ciała funkcji i muszą inicjować swoje składowe za pomocą stałych wyrażeń. Destruktory takich typów powinny być trywialne.

Typy użytkownika, gdy kopiują constexpr, także powinny być zdefiniowane jako constexpr w celu umożliwienia zwracania ich przez wartość przez stałowyrażeniową funkcję. Dowolna metoda klasy, np. konstruktor kopiujący, operatory przeciążone, itd., mogą być zadeklarowane jako constexpr dopóki odpowiadają one definicji stałowyrażeniowej metody. Umożliwia to kompilatorowi kopiowanie klas w czasie kompilacji, wykonywanie operacji na nich, itd.