簡體   English   中英

模板函數模糊參數推導為0

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM