Я заметил, что не получаю никаких ошибок компилятора, когда случайно забыл вернуться из функции, которая должна возвращать ссылку. Я написал несколько небольших тестов, чтобы увидеть, что на самом деле происходит, и я запутался больше всего на свете.
struct Foo
{
int x;
Foo() {
x = 3;
}
};
Foo* foo = new Foo;
Foo& test(bool flag) {
if (flag)
return *foo;
}
Если test () не (явно) не возвращает значение, я все равно получу что-то возвращенное. Однако возвращаемый объект Foo не инициализируется с помощью конструктора по умолчанию & mdash; это потому, что x отличается от 3 неявным возвращаемым значением.
Что на самом деле происходит, когда вы не возвращаете ссылку? Если это функция, безопасно ли ее использовать в качестве средства для возврата фиктивных объектов в случае возникновения ошибок, в отличие от возврата нулевого указателя. (См. Пример ниже.)
class FooFactory
{
// Return reference...
Foo& createFooRef() {
Foo* foo = new Foo;
bool success = foo->load();
if (success)
return *foo;
// Implicit (and safe?) return value on failure?
}
// ... as opposed to returning a pointer.
Foo* createFooPtr() {
Foo* foo = new foo;
bool success = foo->load();
if (success)
return foo;
else
return 0;
}
// Yes, I am aware of the memory leaks,
// but that's not the point of the example.