TL; DR
Use std::reference_wrapper
assim:
#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 X
contendo objetos do tipo T
, T
deve ser Erasable
de 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.