Я пытаюсь реализовать метод поиска, чтобы извлечь ссылку на значение из контейнера и вернуть значение по умолчанию, если значение не найдено или имеет несовместимый тип.
template<class T> const T& get (key_type k, const T& def)
{
const T* r = dynamic_cast<const T*> (find(k)); // suppose `find` returns a pointer to common base class or NULL if the key not found
return r ? *r : def;
}
эта функция работает некорректно, если def
является временным объектом:
const sometype& val = find(key, sometype(someargs));
Итак, можно ли обработать этот случай, используя ссылку rvalue и каким-то образом перемещая или копируя временный объект?
template<class T> const T& get (key_type k, T&& def)
{
const T* r = dynamic_cast<const T*> (find(k)); // suppose `find` returns a pointer to common base class or NULL if the key not found
return r ? *r : std::move(def); // or copy? or something else?
}
T
также может быть абстрактным базовым классом. И, пожалуйста, я бы предпочел безбустовое решение.
end
, то он допустим для косвенного прохождения. - person NathanOliver   schedule 24.08.2020template<class T> const T& get (key_type k, T&& def) = delete;
достаточно или я должен такжеdelete
перегрузить доconst T&&
? - person Nick   schedule 24.08.2020get (key_type k, T&& def) = delete;
было бы плохо, так как это также мешает вам принимать значения lvalue (благодаря правилам свертывания ссылок). Я думаю, чтоget (key_type k, const T&& def) = delete;
должно работать. - person NathanOliver   schedule 24.08.2020