¿Confusión con respecto al propósito / comportamiento de la devolución de datos agregados?

Mientras mira elOpciones de advertencia de GCC, Me encontré con-Gregarse-retorno.

-Gregarse-retorno
Avisar si se definen o llaman funciones que devuelven estructuras o uniones. (En los idiomas en los que puede devolver una matriz, esto también provoca una advertencia).

Pequeño ejemplo que provoca la advertencia:

class foo{};
foo f(void){return foo{};}
int main(){}

$ g ++ -std = c ++ 0x -Waggregate-return -o main main.cpp
main.cpp: En la función ‘foo f ()’:
main.cpp: 2: 5: warning: function devuelve un agregado [-Waggregate-return]

Otro pequeño ejemplo que no provoca la advertencia:

#include <string>
std::string f(void){return "test";}
int main(){}

¿Cuál es el beneficio obtenido al usar -Waggregate-return?
¿Por qué alguien querría ser advertido sobre esto?
Además, ¿no es std :: string una clase? ¿Por qué no advertí sobre el 'agregado devuelto' en el segundo ejemplo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta