考慮下面的小例子:不是最後一個模板參數的扣減和參數包是這個有效的代碼嗎?
template<typename... A, typename R>
void f(A&&..., R(*)(A...)) {}
void g(int, char) {}
int main() {
f<int, char>(42, 'c', g);
}
的參數包A
不是最後一個參數。
無論如何,我認爲R
可能已經從函數指針推導出來,因爲[temp.param]/11。
GCC(6.2)本agrees with me,而鐺(3.9)rejects the code,並說,它不能推斷出模板參數R
。
我的期望是否錯誤,因此GCC不應該接受它,或者是鏗鏘聲的問題?
當原型是'R(*)(A ...),A && ...'時會發生什麼?我認爲'clang'是正確的,因爲參數包應該吞下函數指針,因此不能推導出'R'。 – StoryTeller
@StoryTeller好點。兩個編譯器都接受這些代碼。無論如何,這是不完全一樣的。移動函數指針允許我也刪除''並將'f'作爲f(g,42,'c')'調用。 –
skypjack
我不確定*它是一個問題。可能只是一個GCC增強。 – StoryTeller