TL; DR
Use std::reference_wrapperassim:
#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
Resposta longa
Como o padrão sugere , para um contêiner padrão Xcontendo objetos do tipo T, Tdeve ser Erasablede X.
Erasable significa que a seguinte expressão está bem formada:
allocator_traits<A>::destroy(m, p)
Aé alocador tipo de recipiente, mé exemplo alocador e pé um ponteiro de tipo *T. Veja aqui paraErasable definição.
Por padrão, std::allocator<T>é usado como alocador de vetor. Com o alocador padrão, o requisito é equivalente à validade de p->~T()(Observe que Té um tipo de referência e pé ponteiro para uma referência). No entanto, o ponteiro para uma referência é ilegal , portanto, a expressão não está bem formada.