2013-03-13 62 views

回答

8

雖然這不符合作爲一個強大的動力指定的pointer_traits<>T* const專業化應該存在,我想爲什麼它沒有被列入可能是pointer_traits<>主要是指在一個範圍內,其中使用說明模板論證扣除(並且特別是類型扣除)發生。

因爲類型推導忽略頂級CV-資格,爲T* constT* volatileT* const volatile可能被認爲是不必要的專業化:

#include <type_traits> 

template<typename T> 
void foo(T) 
{ 
    static_assert(std::is_same<T, int*>::value, "Error"); // Does not fire! 
//        ^^^^ 
} 

int main() 
{ 
    int x = 0; 
    int* const p = &x; 
    foo(p); 
} 

當然,這並不意味着具有T* cv專業化會受到傷害這種情況下,我只是想提供一個可能的解釋,說明爲什麼這些專業化失蹤。

同樣,iterator_traits<>沒有專門提供T* cv

+1

我有一個'foo(T&)'類型的函數模板,它會觸發:( – 2013-03-13 14:27:58

+0

@Johannes:是的,這是一個不會忽略頂級cv限定符的情況。只是爲了澄清,我只是試圖給出一個可能解釋爲什麼專業化不存在;我不主張它*不應該在那裏(實際上,實現似乎爲'shared_ptr <>'提供了它) – 2013-03-13 15:01:03

+0

在'foo(T&)'限定符'T'不是頂級的,'&'是頂級的,任何cv-qualifier都是「一級的」 – 2013-03-13 16:17:27

相關問題