簡體   English   中英

C ++:從void函數返回void函數的返回值

[英]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();” 只是一種方便的方式,在我可以/必須立即離開的情況下,不將所有東西放在有條件的情況下。

n4582

6.6.3 return語句[stmt.return]

第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.

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