cin tal cual ignora los espacios, tabulaciones y saltos de línea (Enter) al inicio de lo que se escribe, es decir, si no pones nada y das Enter no pasa nada porque lo ignora, si quieres que no sea ignorado debes usar otra instrucción
Entiendo que estás iniciándote en esto, yo recomiendo siempre un buen libro que detalle el comportamiento de las instrucciones que se usan para entenderlas, por ejemplo:
Fundamentos de Programación con C++
http://www.lcc.uma.es/~vicente/docencia/cppdoc/programacion_cxx.pdfRevisa la parte de "Entrada y Salida de Datos Básica" ahí lo explica todo, en especial la subparte de "Entrada de Datos"
Normalmente se suele utilizar getline para tomar toda la entrada de datos quitando el Enter final, esto lo puedes ver también en el libro en la sección: "6.2.1. Entrada y Salida de Cadenas de Caracteres"
Para tu ejercicio usando getline sería así:
#include <iostream>
#include <string>
using namespace std;
int main () {
struct datos {
string nombre;
int edad;
};
datos persona;
//Pide un nombre, y rechaza la opcion cuando se ingresa "p".
//En vez de "p" debería ingresar un espacio vacío o nada.
do {
cout << "Ingrese nombre: ";
getline(cin, persona.nombre);
if (persona.nombre.compare("") == 0) {
cout << "No hay nombre." << endl;
}
} while (persona.nombre.compare("") == 0);
return 0;
}
Recomiendo leer al completo las dos partes que mencioné porque además de mostrar con ejemplos el uso y comportamiento de cada instrucción también muestra posibles errores del uso de estos o la combinación de estos y como solucionarlos. Esto lo digo porque veo que también vas a pedir la Edad que seguramente lo pedirás con cin, en la página 58 y 59 tienes lo que sería tu ejercicio resuelto usando getline y cin con nombre y edad