[英]C++: return the return value of a void function from a void function
我有幾個void函數(讓它們分別稱為foo和bar),它們共享相同的void函數清理功能,如果它們弄亂了,則清理它們:
#include <iostream>
void cleanup() { std::cout << "doing cleanup" << std::endl; }
void foo(int & i) {
if(i == 0) { return cleanup(); }
--i;
if(i == 0) { return cleanup(); }
++i;
}
void bar(int & i) {
if(i == 0) { return cleanup(); }
++i;
if(i == 0) { return cleanup(); }
--i;
}
int main() {
int i = 0;
foo(i);
bar(i);
return 0;
}
cpp.sh會愉快地編譯並運行代碼。
感謝這個問題的答案,我知道我可以返回void類型的對象。 但是我不知道它是否適用於返回void返回值。
您認為代碼是否符合標准?
您是否願意返回偽整數以使代碼更具可讀性? 還是無用的返回值會使代碼更難閱讀?
編輯:我覺得我需要添加一些澄清,為什么例如'cleanup(); 返回;' 不是解決方案。 實際的代碼比示例更復雜,並且取決於我離開函數的位置,在cleanup()調用之后還會發生其他事情。 “返回cleanup();” 只是一種方便的方式,在我可以/必須立即離開的情況下,不將所有東西放在有條件的情況下。
第2段
return語句的expr-or-braced-init-list稱為其操作數。 沒有操作數的return語句只能在返回類型為cv void,構造函數(12.1)或析構函數(12.4)的函數中使用。 操作數類型為void的return語句只能在返回類型為cv void的函數中使用。 帶有任何其他操作數的return語句只能在返回類型不是cv void的函數中使用; return語句將初始化對象或引用,該對象或引用將通過操作數的副本初始化(8.5)返回。
問題:
但是我不知道它是否適用於返回void返回值。
是的,從返回void的函數返回void表達式是完全有效的。 這在模板化代碼中變得非常方便,因此您不必使用特殊情況的void函數。
您認為代碼是否符合標准?
是的,一點沒錯。
您是否願意返回偽整數以使代碼更具可讀性? 還是無用的返回值會使代碼更難閱讀?
這完全取決於您和您的美學。 它會使代碼對您來說更具可讀性(或者您有需要遵循的編碼准則)。 我個人不會返回偽值(因為用戶可能期望它們有一些含義)。
這對於完美轉發很有用。 想象一下,您有一個類型為(模板參數)的函子,因此返回類型可能是任何東西。 擁有返回void
類型值的權限,您可以調用仿函數並將其返回值公開給調用者,而無需為無返回值的情況編寫單獨的代碼。
template<typename Functor, typename... Args>
auto forward(Functor what_to_call, Args... args) -> decltype(what_to_call(std::forward<Args>(args)...))
{
return what_to_call(std::forward<Args>(args)...);
}
那已經很混亂了,但是如果不是要使用return
關鍵字傳播void返回類型的能力,則需要兩個由enable_if
控制的變體。
template<typename Functor, typename... Args>
auto forward(Functor what_to_call, Args... args) -> enable_if<is_same_type<decltype(what_to_call(std::forward<Args>(args)...)), void>::value, void>::type
{
what_to_call(std::forward<Args>(args)...);
return;
}
template<typename Functor, typename... Args>
auto forward(Functor what_to_call, Args... args) -> enable_if<!is_same_type<decltype(what_to_call(std::forward<Args>(args)...)), void>::value, decltype(what_to_call(std::forward<Args>(args)...))>::type
{
return what_to_call(std::forward<Args>(args)...);
}
因此, return function_returning_void();
設計用於有用的特殊情況。 不必僅僅因為可能就必須返回void
類型或其他任何類型的虛擬對象。 例如,不要return void();
或return -1;
簡單return;
會做。
您認為代碼是否符合標准?
是的,它確實。 在返回功能void
,你可以,如果表達式的類型是使用表達式return語句中void
。 如果是對也返回void
的函數的調用,則為后者。
您是否願意返回偽整數以使代碼更具可讀性? 還是無用的返回值會使代碼更難閱讀?
我認為虛擬整數不會使代碼更具可讀性。 程序員期望返回值有意義。
我認為更具可讀性的是將函數調用和返回語句分開:
cleanup();
return;
盡管我承認,但這完全是見解。
如果一個函數不返回任何值,那么檢查該函數是否成功完成了它必須做的事情將更為明智。 一個小例子:
bool foo()
{
if (DoSomeThing() == true)
{
return true;
}
else
{
return false;
}
然后,您可以返回foo()的返回值:
if (!foo())
{
Console.WriteLine("foo returned false!");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.