TL; DR
Используйте std::reference_wrapper
как это:
#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;
}
Демо
Длинный ответ
Как предполагает стандарт , для стандартного контейнера X
, содержащего объекты типа T
, T
должен быть Erasable
из X
.
Erasable
означает, что следующее выражение правильно сформировано:
allocator_traits<A>::destroy(m, p)
A
- тип распределителя контейнера, m
- экземпляр распределителя, а p
- указатель типа *T
. См. здесь для определения Erasable
.
По умолчанию std::allocator<T>
используется в качестве распределителя вектора. При использовании распределителя по умолчанию требование эквивалентно допустимости p->~T()
(обратите внимание, что T
является ссылочным типом, а p
является указателем на ссылку). Однако указатель на ссылку недопустим , поэтому выражение сформировано некорректно.