2013-12-23 45 views
8

有人可以幫助我理解這種正確的行爲與否。char *和char [N]的模糊錯誤

考慮這個例子:

#include <iostream> 
using namespace std; 

template <typename T> 
struct test { 
}; 

template <typename T> 
bool operator==(const test<T>& obj, const T* arr) { 
    return true; 
} 

template <typename T, size_t TN> 
bool operator==(const test<T>& obj, const T (&arr)[TN]) { 
    return false; 
} 

int main() { 
    cout << (test<char>() == "string") <<endl; 
    return 0; 
} 

使用GCC 4.7.3編譯它只是罰款和預期產出 '0'。

但使用Visual Studio編譯器報告ambiguous error (C2593)

誰在這種情況下是正確的,standard對此有何評論?

謝謝。

+1

我覺得這是模棱兩可的。 – Shoe

回答

4

使用gccclang的相當新近版本(即最近的開發分支的負責人)也顯示出不明確性。我會認爲重載一個數組更好,但它看起來代碼是不明確的。然而,我沒有追蹤標準中的相關條款。

+2

+1我相當肯定它是由14.8.2.4'[temp.deduct.partial]'和14.5.6.2'[temp.func.order]'驅動的。說標準的那些部分是「肉感」將是對史詩比例的粗略低估。無論如何,我已經通過實際操作來回答類似的問題(現在不記得它),並相信你是正確的,所以+1。 – WhozCraig

+3

關鍵在於身份和數組到指針轉換的排名是相同的:*完全匹配*,所以沒有一個轉換序列(沒有轉換/數組到指針)比另一個更糟。 –

1

據我所知,簡單的重載不適用於新版本的gcc,並且已經在VC10中不起作用。

因此,如果有人想知道如何在這裏解決此問題的一個解決方案:

template <typename T> 
struct test { 
}; 

template <typename T> 
struct parse { 
}; 

template <typename T> 
struct parse<T*> { 
    static bool run() { 
     return true; 
    } 
}; 

template <typename T, size_t TN> 
struct parse<T[TN]> { 
    static bool run() { 
     return false; 
    } 
}; 

template <typename T, typename T2> 
bool operator==(const test<T>& obj, const T2& obj2) { 
    return parse<T2>::run(); 
} 

int main() { 
    cout << (test<char>() == "string") <<endl; 
    cout << (test<char>() == (char*)"string") <<endl; 
    return 0; 
} 

與VC10,GCC-4.6.3和gcc-4.8.1編譯它。 似乎工作正常。