const&
параметр случайно привязан к временному?У нас есть класс, который по сути выглядит так:
template<typename T>
struct Observer {
const T* target;
void observe(const T& x) {
target = &x;
}
};
То есть эти объекты будут «держаться» за тот const-ref, который они передают.
У нас была ошибка, когда observe
Функция случайно получила временный объект — что-то, что никогда не может быть действительным для этого случая.
Какие варианты у нас есть, чтобы предотвратить случайную привязку к временному?
Изменение подписи на (const T* px)
будет работать технически (принятие временного адреса — это предупреждение компилятора = ошибка здесь), это не очень привлекательно по другим причинам.
Примечание: да, это всегда будет иметь потенциальные проблемы управления жизненным циклом, но до сих пор реальная вещь работала довольно хорошо из-за ее ограниченного шаблона использования — но случайная передача временных имеет наблюдалось на практике, поэтому мы хотим рассмотреть это в первую очередь.
Вы можете добавить ссылочную перегрузку rvalue и удалить ее:
void observe(const T&& x) = delete;
Теперь будет выдана ошибка компиляции, если кто-то попытается передать временный.
Других решений пока нет …