[英]Strange behavior of reference in c++
我對 c++ 中的引用類型有點困惑,這是我的代碼片段。
class data
{
public:
std::vector<int> Get() const
{
return vec;
}
private:
std::vector<int> vec = {1,2,3,4};
};
int main()
{
data dat;
auto const& a = dat.Get()[1];
auto const& b = dat.Get()[2];
std::cout << "a = " << a << ", b = " << b << std::endl;
return 0;
}
output a = 0, b = 1433763856
沒有任何意義,在我刪除a
和b
之前的前導&
之后,一切正常。 現在我的問題是:
vector::operator[]
確實返回容器內元素的引用,為什么沒有拋出錯誤?data::Get()
function 會導致深拷貝,但為什么我得到錯誤的a
和b
值? 在 function 調用之后,返回值會被銷毀嗎?您返回向量的副本,作為簽名
std::vector<int> Get() const
暗示,而不是
std::vector<int> /*const*/& Get() const
這將返回一個引用,這是真的,但這並不能真正解釋為什么在這種情況下返回一個副本是一個錯誤。
畢竟,如果電話是
auto const& v = data.Get(); // *your* version here, the one returning by copy
v
不會懸空。
關鍵是您不會通過將其綁定到引用來保持該副本的活動(正如我在最后一個片段中所做的那樣)。
相反,您在該臨時調用operator[]
,並且該調用導致對向量中值的引用int&
。 當dat.Get()
返回的臨時向量被銷毀時,這就是懸空的引用。
如果operator[]
按值返回,那么即使您的示例中的a
和b
也不會懸空。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.