为什么'return &variable'无效?

问题描述 投票:0回答:2

我在类变量和访问其内存位置的方法方面遇到一些编译器问题。我需要能够返回类变量的地址,并且我需要其他类能够读取该地址。

class A

public:  
    bool& getFlag();

private:
    bool flag;

inline bool& A::getFlag()
{
    return &flag;
}

我希望这就足够了,但我收到以下错误:

invalid initialization of non-const reference of type ‘bool&’ from an rvalue of type ‘bool*’
   return &flag;

我不明白为什么它读取的是 bool* 甚至是我到目前为止所写的右值。我对 C++ 相当陌生,所以如果这是一个基本问题,请理解,哈哈。

到目前为止,我看到了两种可能的解决方案。一,定义一个变量来保存 get 函数中的地址并返回该变量,我认为这不会起作用,因为该变量将是临时的,我特别需要返回 bool&,而不是 const bool&。另一种是定义另一个类变量来保存地址并使用 get 函数返回这个新变量。我相信这会起作用,但感觉有点笨拙,我想知道是否有更好的方法,或者我在当前的实现中是否犯了一些错误,否则它会起作用。

c++ memory-address
2个回答
0
投票

一般来说并不是无效的,即编译器会编译这样的代码。但是,如果您返回的地址的对象是该函数的局部变量,并且您将尝试使用返回的地址来使用该对象,则可能会出现运行时后果。请注意,您将能够安全地操作指针本身,即将其作为参数传递给其他函数,将其与某些东西进行比较,减少或增加它等。但是一旦您尝试取消引用它,它很可能会指向对于一些垃圾,因为局部变量是在堆栈上分配的,并在封闭函数返回时被销毁,因此您将拥有指向已取消初始化的对象的指针,而且,该堆栈内存可以进一步重用。这是 C++ 和 C 程序中非常常见的错误来源。所以通常情况下,您不想返回局部变量的地址。我想说,从运行时的角度来看,所有其他情况(例如返回成员变量或全局变量的地址)“更有效”。至少在第一种情况(成员变量)中,直到封闭对象存在为止,指针将有效。在第二种情况(全局变量)中,直到全局变量未初始化为止,这通常是由特殊的 C++ 运行时库内部函数完成的,在程序存在时调用,因此很可能是有效的。


-2
投票

您遇到的错误是因为您试图在 getFlag 方法中返回指向 bool (即

bool*
)的指针作为对
bool
(即
bool&
)的引用,这不是允许。该错误消息表明您正在尝试使用右值(临时)指针初始化非常量引用。

如果你想返回对flag成员变量的引用,你应该这样做:

class A {
public:  
    bool* getFlag(); // Return a pointer to the bool.

private:
    bool flag;
};

inline bool* A::getFlag() {
    return &flag; // Return a pointer to the member variable.
}
© www.soinside.com 2019 - 2024. All rights reserved.