簡體   English   中英

std :: function vs auto調用不同的重載

[英]std::function vs auto call to different overload

我有以下代碼:

#include <iostream>
#include <functional>

void f(const std::function<void()>&)  
{  
    std::cout << "In f(const std::function<void()>&)." << std::endl;  
}  

void f(std::function<void()>&&)
{  
    std::cout << "In f(std::function<void()>&&)." << std::endl;  
}  

int main()  
{  
    auto func = []() { std ::cout << "func\n"; };
    f(func); // calls void f(std::function<void()>&&)

    /*const*/ std::function<void()> func2 = []() { std ::cout << "func\n"; };
    f(func2); // calls void f(const std::function<void()>&)

    f([]() { std ::cout << "func\n"; }); // calls void f(std::function<void()>&&)

    return 0;
} 

我想知道為什么第一次調用f (當我使用auto和lambda函數時)調用void f(std::function<void()>&&)重載而不是void f(const std::function<void()>&) ,當我將變量聲明為( conststd::function<void()>時,由第二次調用f調用。

對於第一種情況,即使用autofunc的類型是一個唯一的lambda閉包類型,它不是std::function<void()> ,但可以隱式轉換為std::function

std :: function的實例可以存儲,復制和調用任何Callable目標 - 函數,lambda表達式,綁定表達式或其他函數對象,以及指向成員函數和指向數據成員的指針。

在轉換之后,我們將獲得類型為std::function<void()> rvalue,並且對rvalue的綁定rvalue-reference比在重載解析中綁定lvalue-reference到rvalue更好,然后調用第二個重載。

3)標准轉換序列S1優於標准轉換序列S2 if

c)或者,如果不是這樣,S1和S2都將引用參數綁定到ref-qualified成員函數的隱式對象參數之外的其他內容,S1將rvalue引用綁定到rvalue,而S2綁定左值引用一個右值

對於func2情況, func2被聲明為std::function<void()>的確切類型,然后是f(func2); 不需要轉換。 作為命名變量, func2是一個左值,它不能綁定到rvalue-reference,然后調用第一個重載。

如果rvalue參數對應於非const左值引用參數或lvalue參數對應於rvalue引用參數,則該函數不可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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