¿Es realmente necesario std :: move en la lista de inicialización del constructor para miembros pesados pasados por valor?

Recientemente leí un ejemplo decppreference ... / vector / emplace_back:

struct President
{
    std::string name;
    std::string country;
    int year;

    President(std::string p_name, std::string p_country, int p_year)
        : name(std::move(p_name)), country(std::move(p_country)), year(p_year)
    {
        std::cout << "I am being constructed.\n";
    }

Mi pregunta: es estostd::move realmente necesitado? Mi punto es que estop_name no se usa en el cuerpo del constructor, por lo tanto, tal vez, ¿hay alguna regla en el lenguaje para usar la semántica de movimiento por defecto?

Sería realmente molesto agregar std :: move en la lista de inicialización a cada miembro pesado (comostd::string, std::vector) Imagina cientos de proyectos de KLOC escritos en C ++ 03: ¿agregaremos esto a todas partes?std::move?

Esta pregunta:move-constructor-and-initialization-list la respuesta dice:

Como regla de oro, cada vez que tome algo por referencia de valor, debe usarlo dentro de std :: move, y cada vez que tome algo por referencia universal (es decir, el tipo de plantilla deducido con &&), debe usarlo dentro de std :: adelante

Pero no estoy seguro: ¿pasar por valor no es una referencia universal?

[ACTUALIZAR]

Para aclarar mi pregunta. ¿Se pueden tratar los argumentos del constructor como XValue?

En este ejemplo AFAIK no usamosstd::move:

std::string getName()
{
   std::string local = "Hello SO!";
   return local; // std::move(local) is not needed nor probably correct
}

Entonces, sería necesario aquí:

void President::setDefaultName()
{
   std::string local = "SO";
   name = local; // std::move OR not std::move?
}

Para mí, esta variable local caduca, por lo que se podría aplicar la semántica de movimiento ... Y esto es similar a los argumentos pasados por valor ...

Respuestas a la pregunta(4)

Su respuesta a la pregunta