[英]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()>&)
,當我將變量聲明為( const
) std::function<void()>
時,由第二次調用f
調用。
對於第一種情況,即使用auto
, func
的類型是一個唯一的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.