我有這個作業代碼:
template <typename X, typename Y>
auto f(X a, Y b) { return a b; };
template <typename X, typename Y>
auto f(X* a, Y* b) { return *a *b; };
int main() {
int* p;
int* q;
f(p, q);
}
它編譯并運行第二個f(),因為它更專業。
但是,如果我們const像這樣對引數進行限定:
template <typename X, typename Y>
auto f(const X a, const Y b) { return a b; };
template <typename X, typename Y>
auto f(const X* a, const Y* b) { return *a *b; };
int main() {
int* p;
int* q;
f(p, q);
}
它不再起作用并嘗試選擇第一個函式,在a bfor指標上出錯。
為什么const-qualifying 型別使第二個模板不再更專業?
uj5u.com熱心網友回復:
為什么
const-qualifying 型別使第二個模板不再更專業?
它沒有。
我們在這里觀察到的“問題”是多載決議在檢查哪種型別更專業之前考慮了一些事情。
閱讀最佳可行函式部分,我們可以看到:
對于每對可行函式 F1 和 F2,從第
i-th 個引數到i第 -th 個引數的隱式轉換序列進行排序以確定哪個更好(除了第一個引數,靜態成員函式的隱式物件引數對排行)F1被確定為比F2更好的功能,如果F1的所有引數隱式轉換是不差比F2的所有引數的隱式轉換[...]
現在讓我們來看看這兩個多載:
template <typename X, typename Y>
auto f(const X a, const Y b) { return a b; };
int main() {
int* p;
int* q;
f(p, q);
}
這里X = int*和Y = int*。不需要轉換。值得指出的是,該型別的a和b不是const int*,而是int* const。
現在讓我們看一下第二個多載:
template <typename X, typename Y>
auto f(const X* a, const Y* b) { return *a *b; };
int main() {
int* p;
int* q;
f(p, q);
}
在這里,為了得到const int*(所需的引數型別) from int*(它是pand的型別q),X并且Y必須推匯出 asint* 然后必須發生轉換。那是因為const int*并不意味著const指向int,而是指向const int。指向const int和指向的指標int不一樣,但后者可以轉換為前者。在這種情況下,無法推斷X并且Y沒有轉換。
因此,多載決議選擇轉換次數較少的候選者。該多載嘗試添加兩個指標并導致編譯時錯誤。
uj5u.com熱心網友回復:
模板 1:期望 const int
template <typename X, typename Y>
auto f(const X a, const Y b) { return a b; };
模板 2:需要指向 const int 的指標
template <typename X, typename Y>
auto f(const X* a, const Y* b) { return *a *b; };
更新驅動功能:
int main() {
const int i = 10;
int const * p = &i;
f(p, p); // instantiates Template-2
f(i, i); // instantiates Template-1
}
在原始代碼中,當編譯器嘗試使用指向非常量整數的指標實體化模板 2 時,會發生錯誤。
作業示例:https : //cppinsights.io/s/7db84985
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/375309.html
