我有一個類(公共)函數返回一個向量(但它似乎是不相關的)。爲什麼我可以在C++中調用一個非void成員函數作爲無效函數?
std::vector<int> test() {
return std::vector<int>(1,0);
}
爲什麼我可以調用它就像一個void函數,
test();
沒有得到一個編譯錯誤,或者至少一個警告(牆,迂腐)?
我有一個類(公共)函數返回一個向量(但它似乎是不相關的)。爲什麼我可以在C++中調用一個非void成員函數作爲無效函數?
std::vector<int> test() {
return std::vector<int>(1,0);
}
爲什麼我可以調用它就像一個void函數,
test();
沒有得到一個編譯錯誤,或者至少一個警告(牆,迂腐)?
您可以放棄返回值。一般來說這不是一種好風格,但你可以隨時做到。
這就是爲什麼我們不能在返回類型上重載的原因之一。所以如果你定義了另一個功能void test()
,由於含糊不清,這個調用將不可能。
如果您希望編譯器警告您(有)故意丟棄返回值的情況,請通過標記-Wunused-result
(對於GCC)。 [我不知道其他編譯器的標誌]
一般來說,幾乎所有的返回值都是有意義的,所以有些人使用這個宏來檢測他們無意中丟棄了這個值的情況,特別是如果返回值類似於之後應該檢查的錯誤代碼。
如果要啓用特定功能的警告時,您可以在簽名年底建成的屬性(也可用於GCC,對於MSVC看看this question):
std::vector<int> __attribute__((warn_unused_result)) test() {
return std::vector<int>(1,0);
}
參見:How to raise warning if return value is disregarded?
因此,如果您調用函數但不使用返回值,則會收到警告。請注意,警告不會導致編譯失敗,因此您需要將-Werror
添加到編譯器標誌。
因爲編譯器只是簡單的丟棄返回值。有可能是你的編譯器的選項,警告這個,但它沒有默認啓用。
嘗試將無效函數返回值分配給變量(因爲沒有返回值)是錯誤的,但放棄實際返回值不是錯誤。這是因爲函數調用可能仍然有副作用,並且可能返回值只是提供信息(例如,狀態碼,當你總是期待成功時)。由於類似的情況,語言設計者決定在C++中調用非void函數而不捕獲返回值是可以的。
基本上,類似於你可以使用'x = 5'而不使用'operator =' – amit
@amit的返回值的原因,甚至更多的是:'5;' – WhozCraig
相關:[如何在返回時提示警告值被忽略 - 海灣合作委員會或靜態代碼檢查?](http://stackoverflow.com/questions/2042780/how-to-raise-warning-if-return-value-is-disregarded-gcc-or-static-code-檢查) – jrok