TL; DR
Usar std::reference_wrapperasí:
#include <functional>
#include <string>
#include <vector>
#include <iostream>
int main()
{
std::string hello = "Hello, ";
std::string world = "everyone!";
typedef std::vector<std::reference_wrapper<std::string>> vec_t;
vec_t vec = {hello, world};
vec[1].get() = "world!";
std::cout << hello << world << std::endl;
return 0;
}
Demo
Respuesta larga
Como sugiere el estándar , para un contenedor estándar que Xcontiene objetos de tipo T, Tdebe ser Erasablede X.
Erasable significa que la siguiente expresión está bien formada:
allocator_traits<A>::destroy(m, p)
Aes el tipo de asignador del contenedor, mes la instancia del asignador y pes un puntero de tipo *T. Ver aquí para la Erasabledefinición.
Por defecto, std::allocator<T>se utiliza como asignador de vectores. Con el asignador predeterminado, el requisito es equivalente a la validez de p->~T()(Tenga en cuenta que Tes un tipo de referencia y papunta a una referencia). Sin embargo, el puntero a una referencia es ilegal , por lo tanto, la expresión no está bien formada.