根據這個檔案,它說[強調我的]:
函式的回傳型別對函式多載沒有影響,因此不同回傳型別的相同函式簽名不會被多載。示例:如果有兩個函式:int sum() 和 float sum(),這兩個將產生編譯時錯誤,因為這里不可能進行函式多載。
令人驚訝的是,這個代碼片段有效!
#include <type_traits>
#include <iostream>
template <typename T>
T foo(){return T{};}
template<>
int foo(){std::cout << "int" << std::endl; return int{};}
template<>
double foo(){std::cout << "double" << std::endl; return double{};}
int main() {
foo<int>();
foo<double>();
foo<bool>();
}
你看,下面的代碼片段確實沒有編譯(如果你有問題,請看文章開頭的參考):
#include <type_traits>
#include <iostream>
int foo(){std::cout << "int" << std::endl; return int{};}
double foo(){std::cout << "double" << std::endl; return double{};}
int main() {
}
uj5u.com熱心網友回復:
在第一個片段中,您提供了更通用的主要功能模板的兩個特化。特別是,您提供了我們將擁有的專業化和意義,并且它們彼此不同。foo<T>T=intT=doublefoo<int>foo<double>
所以在第一個片段中沒有函式多載,因為名稱一開始就不一樣。一個是foo<int>,另一個是foo<double>。
從函式多載 11.3.5.5
一個名稱可用于單個范圍內的多個不同功能;這是函式多載。
更重要的是,請注意特化實體化模板;他們不會超載它。因此,特化不會影響函式匹配。
考慮以下示例來說明這一點:
示例 1
template <typename T>
T foo(T a, T b){return T{};}
template <>
int foo(int a, int b){return 4;}
int main()
{
foo(5, 7.0); // error: no matching function for call to ‘foo(int, double)’
}
示例 2
template <typename T>
T foo(T a, T b){return T{};}
int foo(int a, int b){return 4;}
int main()
{
foo(5, 7.0); // works fine
}
另一方面,在第二個片段中,由于函式的名稱相同,因此它是函式多載,我們不能僅在回傳型別上多載普通函式。
從可多載宣告
僅回傳型別、例外規范或兩者不同的函式宣告不能??被多載。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460426.html
