TL; ДОКТОР
Використовуйте 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;
}
Demo
Довга відповідь
Як передбачає стандарт , для стандартного контейнера, X
що містить об'єкти типу T
, T
має бути Erasable
від X
.
Erasable
означає, що таке вираження добре сформовано:
allocator_traits<A>::destroy(m, p)
A
- це тип розподільника контейнера, m
екземпляр алокатора та p
вказівник типу *T
. Дивіться тут для Erasable
визначення.
За замовчуванням std::allocator<T>
використовується як векторний розподільник. Для розподільника за замовчуванням вимога еквівалентна дійсності p->~T()
(Зверніть увагу T
, це тип посилань і p
вказує на посилання). Однак вказівка на посилання є незаконною , отже, вираз є недостатньо сформованим.