TL; DR
Usar std::reference_wrapper
así:
#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 X
contiene objetos de tipo T
, T
debe ser Erasable
de X
.
Erasable
significa que la siguiente expresión está bien formada:
allocator_traits<A>::destroy(m, p)
A
es el tipo de asignador del contenedor, m
es la instancia del asignador y p
es un puntero de tipo *T
. Ver aquí para la Erasable
definició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 T
es un tipo de referencia y p
apunta a una referencia). Sin embargo, el puntero a una referencia es ilegal , por lo tanto, la expresión no está bien formada.