2013-01-08 53 views
0

我有一個類(公共)函數返回一個向量(但它似乎是不相關的)。爲什麼我可以在C++中調用一個非void成員函數作爲無效函數?

std::vector<int> test() { 
return std::vector<int>(1,0); 
} 

爲什麼我可以調用它就像一個void函數,

test(); 

沒有得到一個編譯錯誤,或者至少一個警告(牆,迂腐)?

+2

基本上,類似於你可以使用'x = 5'而不使用'operator =' – amit

+0

@amit的返回值的原因,甚至更多的是:'5;' – WhozCraig

+0

相關:[如何在返回時提示警告值被忽略 - 海灣合作委員會或靜態代碼檢查?](http://stackoverflow.com/questions/2042780/how-to-raise-warning-if-return-value-is-disregarded-gcc-or-static-code-檢查) – jrok

回答

6

您可以放棄返回值。一般來說這不是一種好風格,但你可以隨時做到。

這就是爲什麼我們不能在返回類型上重載的原因之一。所以如果你定義了另一個功能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添加到編譯器標誌。

+1

值得一提的是__attribute __((warn_unused_result)) – stefan

+0

@stefan謝謝,補充一點。 – leemes

+0

Re *這不是一般的好風格*。有時候這是很好的風格。例如,'std :: cout <<「Foo」<< std :: endl;'和'printf(「%s \ n」,「Foo」);'丟棄返回值。將這些調用的返回值轉換爲'void'(例如,'(void)(std :: cout <<「Foo」<< std :: endl);')是迂迴正確的廢話。 –

0

因爲編譯器只是簡單的丟棄返回值。有可能是你的編譯器的選項,警告這個,但它沒有默認啓用。

0

嘗試將無效函數返回值分配給變量(因爲沒有返回值)是錯誤的,但放棄實際返回值不是錯誤。這是因爲函數調用可能仍然有副作用,並且可能返回值只是提供信息(例如,狀態碼,當你總是期待成功時)。由於類似的情況,語言設計者決定在C++中調用非void函數而不捕獲返回值是可以的。

相關問題