盡管這個問題似乎有點令人困惑。代碼很簡單:
template <typename T>
void tfunc(T&& getter)
{
}
template <typename T = void>
void voidfunc( )
{}
int main() {
tfunc(&voidfunc); //error: could not deduce template argument for 'T'
tfunc(&voidfunc<int>); // ok
voidfunc(); //使用默認模板引數呼叫是可以的。
}
Clang 11& msvc visual studio 2019 16.7都抱怨錯誤。 為什么我需要明確指定一個模板引數。
BackGround
- 該引數是一個假引數,只是為了將
voidfunc的實體化延遲到它被使用的地方。型別其實并不重要。 &voidfunc被一些由clangAST生成的代碼使用,否則我需要調整生成器,如果它是一個模板,就寫成&voidfuc<>。__declspec(property(put=voidfunc))然而這個clang/msvc擴展需要voidfunc而不是voidfunc<>
我對生成器進行了調整,以便在給定的函式是模板的情況下,按照@Jarod42所說的,輸出&voidfunc<>。現在它還能用。
uj5u.com熱心網友回復:
正如評論中所說,這種情況在C 20之前的標準中并不明確,為了更好地支持約束函式的新特性,在C 20中被清理掉了。 新的規范在以前的語言版本中是有意義的(忽略了約束的可能性),所以希望實作最終能夠在所有地方支持這種用法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/316146.html
標籤:
