Вроде.Проблема в том, что ссылка обязательно должна ссылаться на реальный объект.Итак, если вы вернетесь по ссылке, тогда кто-то должен создать объект для этой возвращенной ссылки.Поэтому, если вы не можете найти соответствующий объект, возвращать ссылку не имеет смысла.Если вы передаете ссылку, то сначала вы должны создать объект, чтобы аргумент ссылался на него.
Вы можете обойти это, например, следующим образом:
Car &findCar(const string &name) {
...
// return if found, else throw
if (found it) {
return thecar; // assuming `thecar` means some already-existing object,
// if it's a local variable then return by value!
} else {
throw std::runtime_error(name);
}
}
Вызывающий объект выполняет
Car c = findCar("beetle");
или Car &c = findCar("beetle");
, если они хотят «увидеть» фактический найденный объект, а не его копию.Если findCar
хочет, чтобы вызывающие абоненты когда-либо видели только копию, а не какой-то внутренний объект, тогда, конечно, вы можете вернуть по значению, а не по ссылке - разница составляет один &
в сигнатуре функции.кто-то где-то должен обработать исключение.
Если вы предпочитаете избегать исключений, то правильной вещью, которую нужно вернуть из функции find
, является указатель (или другой итератор).Это то, что стандартные контейнеры и алгоритмы делают при поиске, и есть специальные значения (конечные итераторы, или вы можете использовать нулевые указатели), которые означают «не найден».