TL; DR
Sử dụng std::reference_wrappernhư thế này:
#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
Câu trả lời dài
Như tiêu chuẩn gợi ý , đối với một thùng chứa tiêu chuẩn Xchứa các đối tượng loại T, Tphải Erasabletừ X.
Erasable có nghĩa là biểu thức sau đây được hình thành tốt:
allocator_traits<A>::destroy(m, p)
Alà loại cấp phát của trình chứa, mlà thể hiện của cấp phát và plà một con trỏ của loại *T. Xem ở đây để Erasableđịnh nghĩa.
Theo mặc định, std::allocator<T>được sử dụng như là cấp phát của vector. Với bộ cấp phát mặc định, yêu cầu tương đương với tính hợp lệ của p->~T()(Lưu ý đây Tlà loại tham chiếu và plà con trỏ tới tham chiếu). Tuy nhiên, con trỏ đến một tham chiếu là bất hợp pháp , do đó biểu thức không được hình thành tốt.