[英]template deduction of member functions
我試圖通過常規函數、指向常規函數的指針、成員函數和指向成員函數的指針來理解模板參數推導。 有人可以解釋為什么最后一行會產生編譯錯誤而獨立沒有問題嗎?
#include <iostream>
#include <type_traits>
struct A {
int fun(float, char) const&;
};
void standalone(int, char) {}
template <typename T>
void what(T &&) {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
int main()
{
what(standalone); // void what(T&&) [with T = void (&)(int, char)]
what(decltype(&standalone){}); // void what(T&&) [with T = void (*)(int, char)]
what(decltype(&A::fun){}); // void what(T&&) [with T = int (A::*)(float, char) const &]
what(A::fun); // main.cpp: In function 'int main()':
// main.cpp:30:13: error: invalid use of non-static member function 'int A::fun(float, char) const &'
| // what(A::fun);
| ^~~
}
問題是我們不能將引用傳遞給成員,因為從指針到成員:
“指向成員的指針”類型與“指針”類型不同,即指向成員的指針僅由指向成員聲明符語法聲明,從不由指針聲明符語法聲明。 C++ 中沒有“reference-to-member”類型。
這意味着我們必須在調用表達式中顯式使用運算符的地址來傳遞一個指向成員的指針(因為不允許引用成員),如下所示:
//-------v---------> must explicitly use address of operator
what(&A::fun);
盡管與您的情況無關,但請注意,與普通的 function 指針不同,成員 function 與指向該成員的指針之間沒有自動轉換。 也就是說,對於成員函數和需要(允許)指針的上下文,表達式A::fun
和&A::fun
是不等價的。
對於獨立的 function,指向 function 的指針可以根據上下文轉換為 function 引用,例如為了被調用。 function 可以轉換為指向自身的指針。 結果這兩條線既合法又相等。
what(standalone);
what(*********************************************standalone); // stars!
對於每顆星,它的參數都是一個引用,並根據上下文轉換為一個指針,結果將是一個引用,等等。 在 C++ 中,function(參考)是一種類型。
表達式&standalone
明確地是一個指針,所以what(&standalone);
將使用指針。
現在,指向成員的指針是一種不同於普通指針的類型,並且沒有類似的引用形式。 獲取指向成員 function 或成員變量的指針的唯一合法方法是將一元運算operator&
與其嵌套名稱組合。
非靜態成員函數與自由函數有很大不同。 它們只能以非常有限的方式使用。
非靜態成員 function 的唯一可能用途是在成員訪問表達式中調用 function 或作為&
的操作數以形成指向成員的指針。
A::fun
前面沒有&
或成員訪問運算符,它本身在表達式中甚至在語法上都不正確。 decltype(A::fun)
也是病式的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.