我試圖用常規函式、指向常規函式的指標、成員函式和指向成員函式的指標來理解模板引數推導。有人可以解釋為什么最后一行會產生編譯錯誤而獨立沒有問題嗎?
#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);
| ^~~
}
uj5u.com熱心網友回復:
問題是我們不能傳遞對成員的參考,因為從Pointers to members:
“指向成員的指標”型別與“指標”型別不同,即指向成員的指標僅通過指向成員宣告符的指標語法宣告,而從不通過指標宣告符語法宣告。C 中沒有“成員參考”型別。
這意味著我們必須在呼叫運算式中顯式使用運算子的地址來傳遞指向成員的指標(因為不允許參考成員),如下所示:
//-------v---------> must explicitly use address of operator
what(&A::fun);
邊注
盡管與您的情況無關,但請注意,與普通函式指標不同,成員函式和指向該成員的指標之間沒有自動轉換。也就是說,在成員函式的情況下以及在預期(允許)指標的背景關系中,運算式A::fun和&A::fun不等價。
uj5u.com熱心網友回復:
對于獨立函式,指向函式的指標可以根據背景關系轉換為函式參考,例如以便被呼叫。函式可以轉換為指向自身的指標。結果這兩條線既合法又平等。
what(standalone);
what(*********************************************standalone); // stars!
對于每顆星,它的引數都是一個參考,并且在背景關系中轉換為一個指標,結果將是一個參考,等等。在 C 中,函式(參考)是一種型別。
該運算式&standalone是明確的指標,因此what(&standalone);將使用指標。
現在,指向成員的指標是一種不同于通常指標的型別,并且在參考形式上沒有類似物。獲得指向成員函式或成員變數的指標的唯一合法方法是將一元operator&與其嵌套名稱結合起來。
uj5u.com熱心網友回復:
非靜態成員函式與自由函式有很大不同。它們只能以非常有限的方式使用。
非靜態成員函式的唯一可能用途是在成員訪問運算式中呼叫函式或作為運算元來&形成指向成員的指標。
A::fun&如果運算式前面沒有或成員訪問運算子,則其本身在運算式中甚至在語法上都不正確。decltype(A::fun)也是病態的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460443.html
