下面的程式使x函式g<void>()上的指標自動推匯出回傳型別:
template<class=void>
void g() {}
int main() {
auto (*x)() = &g;
(*x)();
}
該程式被 GCC 接受,但在 Clang 中被拒絕并出現錯誤:
error: variable 'x' with type 'auto (*)()' has incompatible initializer of type '<overloaded function type>'
auto (*x)() = &g;
演示:https : //gcc.godbolt.org/z/s17Mf74Wc
哪個編譯器就在這里?
uj5u.com熱心網友回復:
這段代碼
auto (*x)() = &g;
根據P1972所做的更改,尤其是對temp.deduct#funaddr-1的更改,應該是合法的
...如果有目標,則函式模板的函式型別和指定的目標型別作為P和A的型別,推導如13.10.2.5所述。否則,使用型別 P 和 A 的空集進行推導。
我已經強調了在 P1972 中添加的文本。注意,現在如果沒有指定目標型別,就像auto (*)()推導了這個函式的回傳型別一樣,仍然可以進行模板引數推導。以前,在沒有目標型別的情況下,取g.
當然,如果g指定了模板引數,或者指定了目標型別,那么總是可以的
void (*x)() = &g; // ok, target is specified
auto (*x)() = &g<void>; // ok, template parameters specified
鏘不支持P1972還沒有,因此錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/397261.html
