簡體   English   中英

c++ 中參考的奇怪行為

[英]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沒有任何意義,在我刪除ab之前的前導&之后,一切正常。 現在我的問題是:

  1. 由於不允許引用引用,但vector::operator[]確實返回容器內元素的引用,為什么沒有拋出錯誤?
  2. 我知道data::Get() function 會導致深拷貝,但為什么我得到錯誤的ab值? 在 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[]按值返回,那么即使您的示例中的ab也不會懸空。

暫無
暫無

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

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