簡體   English   中英

保留對函數的返回對象值的引用/指針是否合法?

[英]Is it legal to hold reference/pointer to the return object value of a function?

按值傳遞函數的返回對象合法嗎? 我有一個來自A::getA()的函數,該函數按值返回一個對象。 在同一行中引用此值是否合法,請參見b.processA(a.getA());

請在下面查看我的代碼:

class A
{
public:
    int a;
    std::list<int*> m_list;

    A(int a)
    {
        this->a =a;
    }

    A(A& _a)
    {
        this->a =_a.a;
        m_list.push_back(&a);
    }

    A getA()
    {
        A localA(20);
        localA.m_list.push_back(&localA.a);
        return localA;
    }
};

class B
{
public:
    char b;

    B(char b)
    {
    }

    void processA(A& a)
    {
            a.a = 1;
            processA2(a);
    }

    void processA2(A& a)
    {
        a.a = 2;
    }
};

void main()
{
    B b('a');
    A a(11111);
    //************
    // IS THE FOLLOWING LINE LEGAL??
    // I mean, is it legal to pass the return object of the function by value
    //************
    b.processA(a.getA());
}
b.processA(a.getA());

不。它甚至不會編譯。 原因是a.getA()返回一個臨時對象,該對象不能綁定到非const引用類型。

但是,如果將參數const引用設置為:

void processA(A const & a) 

那很好

注意 :MSVC ++提供了到非常量引用的擴展的臨時對象綁定。 它不是標准的。

所以基本上你在問:

X f();
void g(X& x);

g(f());

是否合法?

為了安全起見,非成本參考不能綁定到臨時參考。 因此以上內容不合法。

但是,以下是合法的:

X f();
void g(const X& x);

g(f());

臨時成員將生存直到g返回。

第一個版本不合法的原因是,g所做的任何更改都將被丟棄,那么為什么要這么做呢? 它很可能表明存在邏輯錯誤,因此作為語言設計決策,它被視為編譯時錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM