如果我传递临时引用并将其存储为 class 成员会怎样?

What happens if I pass a temporary reference and store it as a class member?

我有一个 class 存储对某种应用程序状态的引用,然后它在操作期间发生变异:

class Mutator {
    private:
        State& _state;

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

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

}
...

通常我会像这样创建并传递 state

State state;
Mutator mutator(state);

如果我像这样初始化 Mutator,我的 Mutator class 中的状态引用会发生什么:

Mutator mutator(State());

我假设,由于状态引用是临时的,Mutator._state 成员将指向一个内存位置,该位置可能包含也可能不包含导致不可预测行为的状态值。这是正确的吗?

如果使用引用,则需要在构造函数中初始化变量(不为NULL)。这样更安全,因为您确信引用确实指向现有对象。

关于

Mutator mutator(State());

这没有多大意义,除非 State 对象仅用作 Mutator 构造函数的输入;但是,如果它更改新创建的 State 变量,则在创建构造函数 returns 和 mutator 时,删除 State() 实例。

此外(请参阅下面的 NathanOliver 注释),它不是合法的 C++ 代码并且不可移植。

更新

测试应用程序:

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.