Вы также не можете сделать это в C # - вам нужно вернуть new Foo()
, а не null
, чтобы компилятор был доволен.
То же самое в случае C ++ - вам нужно создать экземпляр структуры, если вы собираетесь возвращать по значению. Если нет, вы хотите вернуться по указателю (в этом случае вы будете new
вводить или возвращать указатель на указатель, выделенный другим способом, что вносит грязную семантику передачи владения в уравнение).
РЕДАКТИРОВАТЬ: на основе вашего обновления. Похоже, вы хотите вернуть либо значение, либо мета-значение «null», которое указывает «not found». Вы можете сделать это несколькими способами:
throw
в случае неудачи, в противном случае безоговорочно вернуть значение
- возвращает указатель - но это оставляет ответственность за
delet
поднятие его в воздух, если оно не останется в памяти надолго
- оберните его в [шаблонный] объект-обертку, который обрабатывает условия так же, как это сделал бы .NET
Nullable<T>
(я позволю кому-то присоединиться к правильному UPDATE: @Mike Seymour говорит, что это boost::optional<foo>
)
- использовать шаблон Null Object для возврата подходящего значения, которое правильно работает, когда рассматривается как действительный результат на стороне клиента