¿Cuáles son las reglas para una inicialización de variable estática de clase?

Tengo un código heredado y necesito agregar una nueva clase para el mensaje (que es irrelevante para mi pregunta). Pero resulta que necesito declarar un constructor vacío para que se inicialice algo de estática. No es un constructor predeterminado o un compilador proporcionado, pero está vacío definido por el usuario. Traté de reducir el código a MWE y aquí lo que obtengo:

#include <iostream>

using namespace std;

struct Test
{
    Test() {cout << "Test::Test()" << "\n";}
    void dummy(){}
};

template<typename T>
struct Message
{
    Message()
    {
        test.dummy(); // this call have to be here in order to initialize Test, but why?
    }

    static Test test;
};

template<typename T>
Test Message<T>::test;

struct A : public Message<A>
{
    //A(){} // uncomment this (and comment the default one) to call the Test constructor
    A() = default;
};

int main()
{
}

Esto es lo que está sucediendo:

El programa en sí está vacío, es decir, no se crean instancias.Hay un CRTP para unA clase, que parece ser crítica para el ejemplo.Hay una declaración estática para la base deA y espero que se llame a su constructor.Hay una llamada ficticia a la función que no hace nada, pero también es crítica.

El problema es que si no proporciono un constructor personalizado, nunca se llama al constructor estático. Y no puedo entender por qué necesito esto? ¿Cuál es la diferencia con el valor predeterminado o el compilador generado? ¿Y por qué necesito llamar a una función ficticia?

Creo que hay una regla para eso. Lo comprobé con diferentes versiones de gcc y clang: el comportamiento es el mismo. Aprecio mucho los enlaces al estándar / documentación.

Respuestas a la pregunta(2)

Su respuesta a la pregunta