我一直在Google上尋找答案,試圖找到答案,但我不能用正確的術語搜索,因爲我找不到任何人在討論這種行爲。我試圖找出模板化函數的部分說明是否是C++標準的一部分,或者這是否是編譯器特定的。C++中的部分模板函數規範可行,但爲什麼?
通過部分指定,我的意思是隻指定編譯器無法推斷的類型。所以,如果我有一個模板函數「F」這需要3種類型,一個是在參數使用,可以推斷,我可以稱之爲「F」與形式f<type, type>(parameter)
下面是一個例子:
#include <iostream>
#include <tuple>
#include <string>
template<class A, class B, class C>
std::tuple<A, B> test(C c)
{
// do something based on c, return tuple with types A and B
return std::make_tuple(A(), B());
}
int main(void)
{
// I expected I would have to use this form. Specify all parameters.
std::tuple<int, int> value3 = test<int, int, int>(5);
// Here, I only specified the return value types, did not specify the parameter type, yet it compiles.
auto value1 = test<int, int>("c-string");
// Similar example here. Return types specified, parameter type deduced. Compiles fine.
auto value2 = test<std::string, int>(42);
return 0;
}
我用g ++ 4.5.3,g ++ 4.6.3,VS2010和VS2012測試了這個。由於它似乎得到了編譯器的廣泛支持,我敢打賭它是標準的一部分,但任何人都可以證實?有沒有人有任何鏈接或指向資源,可以解釋爲什麼這可以工作?
謝謝
你還沒有解釋爲什麼你認爲這不應該工作。這裏沒有任何問題。無論如何,你在談論爭論推理,這當然不是新的。 –
看起來像你在尋找這個:http://cpp0x.centaur.ath.cx/temp.deduct.call.html – yonilevy
是的,這就是它yonilevy。謝謝。 –