[英]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.