![](/img/trans.png)
[英]Template argument deduction for variadic function pointer parameter - handling of ambiguous cases
[英]Template function ambiguous parameter deduction for 0
編譯以下示例時我遇到了一個奇怪的問題。
template<typename T>
struct identity {
typedef T type;
};
template<typename T>
void foo(typename identity<T>::type v) {}
template<typename T>
void foo(typename identity<T>::type* v) {}
int main() {
foo<int>(0);
foo<short>(0);
return 0;
}
調用foo<int>(0)
編譯,但是,當我調用foo<short>(0)
,編譯器無法推斷出0是值還是指針。 我使用identity強制顯式指定模板參數。 編譯器(msvc)錯誤消息:
error C2668: 'foo': ambiguous call to overloaded function
是編譯器錯誤嗎?
它不是編譯器錯誤。 這是因為將0轉換為指針類型具有“轉換等級”。
C ++11§4.10(轉換級別)
空指針常量是值為零的整數文字(2.13.2)或類型為std :: nullptr_t的prvalue。 空指針常量可以轉換為指針類型; 結果是該類型的空指針值,並且可以與對象指針或函數指針類型的每個其他值區分開。 這種轉換稱為空指針轉換。
因此,當您編寫0字面值並且需要轉換時,編譯器會遇到兩個類似等級的重載 - 一個是非指針類型,另一個是指針類型。
更多例子:
foo<short>((short)0); // No conversion necessary: allowed
foo<nullptr_t>(nullptr); // No conversion necessary: allowed
foo<nullptr_t>(0); // ambiguous
foo<nullptr_t>(NULL); // ambigious - another reason to stop using NULL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.