CRTP e c ++ 1y tipo de retorno de dedução

Eu estava jogando recentemente com CRTP quando me deparei com algo que me surpreendeu quando usado com funções c ++ 1y cujo tipo é deduzido. O código a seguir 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;
}

Eu assumi que o tipo de retorno deBase<Derived>::foo era umdecltype da expressão retornada, mas se eu modificar o functiofoo como isso:

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

Este código não funciona mais, recebo o seguinte erro (do 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'|

Minhas perguntas são: Por que não funciona? O que eu poderia gravar para obter o tipo de retorno correto sem depender da dedução do tipo de retorno automático?

E bem ... aqui está umexemplo vivo.

questionAnswers(2)

yourAnswerToTheQuestion