我正在努力理解將參考函數作爲通用參考傳遞給函數時會發生什麼(正在推導哪種類型)。讓我們假設我們有一個函數foo接受一個PARAM作爲通用參考:將參考函數作爲通用參考傳遞
template<typename T>
void foo(T&& param)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
然後讓我們做到以下幾點:
void(&f)(int) = someFunction;
foo(f);
結果將是:
void foo(T&&) [with T = void (&)int]
這是完全可以理解的:我們將lvalue傳遞給函數foo,所以推導的類型是void(&)int,並且參數的類型將爲「void(& & &)int」,其參考摺疊規則變爲無效(&)int。參數將只是一個函數的左值引用。
但是,當我做到以下幾點:
void(&f)(int) = someFunction;
foo(std::move(f));
foo將打印:
void foo(T&&) [with T = void (&)int]
這也正是像以前一樣!這裏發生了什麼?爲什麼結果與傳遞左值相同?我期望,因爲我們傳遞右值到foo,所推導的類型應該是T = void(int),並且參數應該變爲void(int323)。對於所有其他「常規」類型(如類,基本類型等),這總是會發生。爲什麼在處理函數引用時它有所不同?
Nah。 'param'有一個名字,根據定義它是一個左值。 –
@KerrekSB抱歉,這是錯誤的 - http:// stackoverflow。com/questions/7016777/what-is-rvalue-reference-to-function-type –
@rubix_addict:我的不好,謝謝!刪除。我是在聲明之後,這是答案的一部分,但我沒有把它說清楚。 –