5

假設我有其中類型參數用作只返回類型的函數模板:語法無疑爲專業函數模板

template <typename T> 
T foo() 
{ 
    return whatever; 
} 

那麼什麼是正確的語法專注的是函數模板?以下兩種方式似乎都有效:

template <> 
std::string foo() 
{ 
    return whatever; 
} 

template <> 
std::string foo<std::string>() 
{ 
    return whatever; 
} 

兩者有什麼區別嗎?如果不是,習慣用法是什麼?

回答

1

編譯器將根據提供的信息(此處爲函數返回類型)推導出正確的模板特化。

所以這些語法具有完全相同的行爲,一個比另一個更明確。

1

在大多數情況下,兩者之間沒有區別。

如果您重載了多個模板函數,則可能需要使用第二個表單來消除關於您要專門處理哪個重載的歧義(如果處於這種情況,您可能還有其他問題,例如,您還需要在呼叫地點明確)。

+0

在這個例子中,已經不可能在呼叫站點推導出模板參數。 –