2013-03-13 67 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

相关问题