簡體   English   中英

控制到達非無效功能的終點

[英]Control reaches end of non-void function

以下代碼片段在編譯時會生成一些警告消息:

Cluster& Myclass::getCluster(const Point &p)
{
    foreach (Cluster c, *this)
        foreach (Point point, c)
            if (point == p)
                return c;
}

警告是:

  1. 返回對本地變量'c'的引用[默認啟用]
  2. 控制到達非無效函數的結尾[使用-Wreturn-type ]

我知道如果條件失敗,我不會返回任何值。 但是,當我嘗試return 0它給了我錯誤。

我該如何解決這些問題?

如果您的函數可以合理地找不到匹配的Cluster ,那么您應該讓它返回一個指針:

Cluster* Myclass::getCluster(const Point &p)
{
    foreach (Cluster c, *this)
        foreach (Point point, c)
            if (point == p)
                return &c;
    return 0; // or return nullptr; in C++11
}

但這還行不通,因為c是局部變量。 因此,您可以將其作為參考,例如:

Cluster* Myclass::getCluster(const Point &p)
{
    foreach (Cluster& c, *this)
        foreach (Point point, c)
            if (point == p)
                return &c;
    return 0; // or "return nullptr;" in C++11
}

第一個表示c是局部變量。 這樣,它將超出范圍並在函數返回時死亡。 由於您是通過引用返回的,因此呼叫者會得到一個懸空的引用。 另一個錯誤是您在某些情況下無法返回任何內容。 返回0並沒有幫助,因為返回類型是對Cluster引用 您需要某種機制來確保將群集引用返回到不會立即死亡的群集。 參見例如這個問題

變量c 局部變量,因為它是在getCluster函數中聲明和定義的。 由參考返回到它,當函數返回參考“指向”,其中使用的變量是。

對於其他警告,如果條件從不為真,該函數將返回什么呢?

返回對本地變量'c'的引用[默認啟用]

您不應返回對局部變量的引用,因為一旦函數返回,該變量將不再存在,因此您將引用不存在的內容。 編譯器會警告您。

控制到達非無效函數的結尾[-Wreturn-type]

為函數指定返回類型后,每個控制路徑都應返回該值。 如果條件評估為false則您的代碼將永不返回任何內容,因此編譯器會抱怨。

暫無
暫無

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

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