Почему компилятор c ++ не предупреждает о возврате ссылки на локальную переменную? - PullRequest
0 голосов
/ 23 марта 2019

В приведенном ниже коде компилятор предупреждает о возвращении ссылки на local при вызове метода bar ().Я ожидал аналогичного предупреждения о методе foo ().

#include <iostream>

class Value {
public:
    int& foo() {
        int tc = 10;
        int& r_tc = tc;
        return r_tc;
    }

    int& bar() {
        int tc = 10;
        return tc;
    }
};

int main() {
    Value value;
    int& foo_ref = value.foo();
    int& bar_ref = value.bar();
    std::cout << foo_ref << std::endl;
    return 0;
}

Выход компиляции:

g++ -c refreturn.cc -g -std=c++1z; g++ -o refreturn refreturn.o
refreturn.cc: In member function ‘int& Value::bar()’:
refreturn.cc:12:13: warning: reference to local variable ‘tc’ returned [-Wreturn-local-addr]
         int tc = 10;
             ^

Compilation finished at Sat Mar 23 07:29:31

1 Ответ

4 голосов
/ 23 марта 2019

"Почему компилятор c ++ не предупреждает о возврате ссылки на локальную переменную?"

Поскольку компиляторы не идеальны и, в конечном итоге, ваша обязанность не писать неверный код.Компилятор не обязан предупреждать обо всем, что неправильно (на самом деле, он обязан предупреждать по очень мало , но большинство стараются сделать лучше, чем минимальное требование).

...