Время жизни объектов, содержащихся в std::map
или std::unordered_map
, - это время жизни карты. Имейте в виду, что объект, который вы назначаете элементу карты, не совпадает с объектом, содержащимся в карте.
Например, в этом фрагменте:
std::map<int, std::chrono::system_clock::time_point> my_map;
auto now = std::chrono::system_clock::now();
my_map[10] = now;
На самом деле задействовано как минимум два time_point
объекта:
now
my_map[10]
Строка my_map[10] = now
на самом деле делает совсем немного:
- Поскольку в
my_map
для ключа 10
не существует значения, map::operator[]
по умолчанию создает новый объект time_point
, вставляет его в my_map
и возвращает ссылку на него.
- Функция оператора присваивания возвращенного объекта
time_point
вызывается и передается ссылка на now
.
time_point::operator=
регулирует состояние time_point
, которое было вызвано, для отражения состояния time_point
, переданного ему.
Это time_point
объект, который хранится на карте, чье время жизни контролируется картой. now
- локальная переменная, поэтому срок ее службы заканчивается в конце области, в которой она была объявлена.
Например, с учетом следующего определения класса:
class Foo {
public:
const std::chrono::system_clock::time_point& do_a_thing(int i);
private:
std::map<int, std::chrono::system_clock::time_point> my_map;
};
Недопустимо следующее определение do_a_thing
:
const std::chrono::system_clock::time_point& do_a_thing(int i) {
auto now = std::chrono::system_clock::now();
my_map[i] = now;
return now; // whoops, returning a reference to a function local
}
, в то время как действует следующее:
const std::chrono::system_clock::time_point& do_a_thing(int i) {
auto now = std::chrono::system_clock::now();
my_map[i] = now;
return my_map[i]; // OK, the lifetime of my_map[i] is the same as my_map
}