https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121641

            Bug ID: 121641
           Summary: Rejects valid constexpr explicitly defaulted
                    constructor which is never a constant expression
                    (P2448R2)
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: janschultke at googlemail dot com
  Target Milestone: ---

struct B { B(); };

struct D : B {
    constexpr D() = default;
};

GCC rejects this code sample; Clang accepts.
https://godbolt.org/z/dM84Gjvoj

> <source>:4:15: error: explicitly defaulted function 'constexpr D::D()' cannot 
> be declared 'constexpr' because the implicit declaration is not 'constexpr':
>     4 |     constexpr D() = default;
>       |               ^
> <source>:1:12: note: defaulted constructor calls non-'constexpr' 'B::B()'
>     1 | struct B { B(); };
>       |            ^
> <source>:1:12: note: 'B::B()' declared here
> Compiler returned: 1

To my understanding, P2448R2 "Relaxing some constexpr restrictions" should make
this code valid because some restrictions in [dcl.constexpr] were lifted:
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2448r2.html#pnum_19

The status quo for C++23 seems to be that this code is perfectly fine, except
that you cannot use D() in a constant expression, but so is life.

Reply via email to