Por que esse destruidor virtual aciona um externo não resolvido?

Considere o seguinte:

NoX.h:

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

X.cpp:

#include "X.h"

X::X()
{}

Tente criar isso (estou usando um destino .dll para evitar um erro no principal ausente e usando o Visual Studio 2010):

Erro 1 erro LNK2001: símbolo externo não resolvido "private: __thiscall virtual X :: ~ X (void)" (?? 1X @@ EAE @ XZ)

Pequenas modificações resultam em uma compilação bem-sucedida, no entanto:

X.h:

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

ou

X.h:

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

O que causa o externo não resolvido no vinculador quando o .dtor é virtual ou quando o .ctor não está embutido?

EDITAR:

Ou, talvez mais interessante, por que eunão obter um externo não resolvido se eu tornar o destruidor não virtual ou se eu embutir o construtor?