Deducción de tipo de retorno CRTP y c ++ 1y

Recientemente estuve jugando con CRTP cuando encontré algo que me sorprendió cuando lo usé con las funciones de c ++ 1y cuyo tipo se deduce. El siguiente código funciona:

template<typename Derived>
struct Base
{
    auto foo()
    {
        return static_cast<Derived*>(this)->foo_impl();
    }
};

struct Derived:
    public Base<Derived>
{
    auto foo_impl()
        -> int
    {
        return 0;
    }
};

int main()
{
    Derived b;
    int i = b.foo();
    (void)i;
}

Supuse que el tipo de retorno deBase<Derived>::foo era undecltype de la expresión devuelta, pero si modifico la functiofoo Me gusta esto:

auto foo()
    -> decltype(static_cast<Derived*>(this)->foo_impl())
{
    return static_cast<Derived*>(this)->foo_impl();
}

Este código ya no funciona, recibo el siguiente error (de GCC 4.8.1):

||In instantiation of 'struct Base<Derived>':|
|required from here|
|error: invalid static_cast from type 'Base<Derived>* const' to type 'Derived*'|
||In function 'int main()':|
|error: 'struct Derived' has no member named 'foo'|

Mis preguntas son: ¿Por qué no funciona? ¿Qué podría escribir para obtener el tipo de devolución correcto sin depender de la deducción automática del tipo de devolución?

Y, bueno ... aquí hay unejemplo vivo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta