A grande pista de que há algo obscuro acontecendo é que o id tem o tipo de retorno T&& . Se ele retornasse T então id(whatever) que id(whatever) seria um prvalue, e o temporário retornado teria seu tempo de vida estendido (no entanto, isso envolveria uma construção).