TL; DR
Gunakan std::reference_wrapper
seperti ini:
#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
Jawaban panjang
Seperti yang disarankan standar , untuk wadah standar yang X
berisi objek bertipe T
, T
harus Erasable
dariX
.
Erasable
berarti ungkapan berikut terbentuk dengan baik:
allocator_traits<A>::destroy(m, p)
A
adalah tipe pengalokasi penampung, m
adalah pengalokasi contoh dan p
merupakan penunjuk tipe *T
. Lihat di sini untukErasable
definisi.
Secara default, std::allocator<T>
digunakan sebagai pengalokasi vektor. Dengan pengalokasi default, persyaratannya setara dengan validitas p->~T()
(Perhatikan, T
ini adalah tipe referensi dan p
penunjuk ke referensi). Namun, penunjuk ke suatu referensi adalah ilegal , oleh karena itu ungkapannya tidak terbentuk dengan baik.