¿Por qué este destructor virtual desencadena un externo no resuelto?

Considera lo siguiente:

EnX.h:

class X
{
    X();
    virtual ~X();
};

X.cpp:

#include "X.h"

X::X()
{}

Intente compilar esto (estoy usando un destino .dll para evitar un error en el main faltante, y estoy usando Visual Studio 2010):

Error 1 error LNK2001: símbolo externo sin resolver "privado: virtual __thiscall X :: ~ X (nulo)" (?? 1X @@ EAE @ XZ)

Pequeñas modificaciones resultan en una compilación exitosa, sin embargo:

X.h:

class X
{
    inline X(); // Now inlined, and everything builds
    virtual ~X();
};

o

X.h:

class X
{
    X();
    ~X(); // No longer virtual, and everything builds
};

¿Qué causa el externo no resuelto en el enlazador cuando el .dtor es virtual o cuando el .ctor no está en línea?

EDITAR:

O, quizás más interesante, ¿por quéno obtener un externo no resuelto si hago que el destructor no sea virtual o si alineo el constructor?

Respuestas a la pregunta(7)

Su respuesta a la pregunta