TL; DR
Sử dụng std::reference_wrapper
như 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 X
chứa các đối tượng loại T
, T
phải Erasable
từ 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)
A
là loại cấp phát của trình chứa, m
là thể hiện của cấp phát và p
là 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 T
là loại tham chiếu và p
là 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.