[英]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;
}
警告是:
-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.