Что произойдет, если я передам временную ссылку и сохраню ее как член класса? - PullRequest
1 голос
/ 24 сентября 2019

У меня есть класс, в котором хранится ссылка на какое-то состояние приложения, которое затем изменяется во время работы:

class Mutator {
    private:
        State& _state;

    public:
        Mutator(State& state);
        ...
};

Mutator::Mutator(State& state) : _state(state) {

}
...

Обычно я создаю и передаю state следующим образом:

State state;
Mutator mutator(state);

Что произойдет со ссылкой на состояние в моем классе Mutator, если я инициализирую Mutator следующим образом:

Mutator mutator(State());

Я предполагаю, что поскольку ссылка на состояние является временной, член Mutator._stateбудет указывать на область памяти, которая может содержать или не содержать значение состояния, что приводит к непредсказуемому поведению.Это правильно?

1 Ответ

0 голосов
/ 24 сентября 2019

Если вы используете ссылку, тогда переменная должна быть инициализирована (как не NULL) в конструкторе.Это безопаснее, поскольку вы уверены, что ссылка действительно указывает на существующий объект.

About

Mutator mutator(State());

Это не имеет особого смысла, если только объект State не используется только как входнойдля конструктора Mutator;однако если он изменяет вновь созданную переменную State, когда конструктор возвращает значение и создается мутатор, экземпляр State () удаляется.

Также (см. примечание NathanOliver ниже), это не является допустимым кодом C ++ и неportable.

Обновление

Тестовое приложение:

class State {
    public: State() {}
};

class Mutator {
    private:  State& _state;
    public:   Mutator(State& state) : _state(state)  { }
};

void setup() {
    Mutator mutator(State());
}

int main() {
    return 0;
}

Код выше компилятора и корректные ссылки на компиляторе Arduino (1.8.9):

Sketch uses 260 bytes (0%) of program storage space. Maximum is 253952 bytes.
Global variables use 0 bytes (0%) of dynamic memory, leaving 8192 bytes for local variables. Maximum is 8192 bytes.
...