C ++ 11 tipos de retorno automático y de función

Sé de la diferencia entreauto, auto&, const auto yconst auto& (por ejemplo, en un bucle "para cada"), pero una cosa que me sorprendió es:

std::string bla;
const std::string& cf()
{
    return bla;
}


int main (int argc, char *argv[])
{
    auto s1=cf();
    const std::string& s2=cf();
    s1+="XXX"; // not an error
    s2+="YYY"; //error as expected
}

Entonces alguien me puede decir cuando el tipo dex en la expresiónauto x = fun(); no será del mismo tipo que el tipo del valor de retorno delfun()?