Вот код:

#include <iostream>

const int& temp_func() {
    return 3;
}

int main() {
    std::cout << temp_func() << std::endl;
}

При компиляции с g ++ (Ubuntu 9.3.0-17ubuntu1 ~ 20.04) результат:

[1]    402809 segmentation fault ...

С другой стороны, при компиляции с помощью clang ++ - 12 результат:

3
0
Arnab De 17 Сен 2021 в 19:17

2 ответа

Лучший ответ

Оба верны. Ваш код имеет неопределенное поведение. Когда вы выполняете return 3, создается временный объект int, и ссылка, возвращаемая функцией, привязывается к этому временному объекту. После завершения оператора return это временное устройство уничтожается, оставляя ссылку висящей. Любой доступ через эту ссылку имеет неопределенное поведение.

5
NathanOliver 17 Сен 2021 в 16:19

Нет «правильного поведения». Эта программа демонстрирует неопределенное поведение, возвращая висящую ссылку на временную , которая является копией литерала 3. Поскольку это неопределенное поведение, может произойти все, что угодно: программа может аварийно завершить работу, она может завершиться успешно, может произойти дисплей 4, или он может периодически выходить из строя. Оба поведения, которые вы видите, приемлемы по стандарту C ++.

2
nanofarad 17 Сен 2021 в 16:19