Question

Why can a ghost const not be used as a witness? Does the compiler need to use the witness as an initial value?

Answer

A type can be

To show a type is auto-initializing, you may need to provide a witness clause. The expression given in the witness clause must be compilable. To just show a type is nonempty, you can use a ghost witness clause. It takes a ghost expression, so you should be able to use your ghost const here. If you don’t care about either, you can say witness *, which makes the type be treated as possibly empty.

When declaring generic types, one can use type characteristics to indicate any restrictions on the types that may be substituted for a type parameter. For example, writing class A<T(0)> says that types substituted fo T must be auto-initializing; writing class A<T(00)> says that such types must be non-empty.