为什么没有为“T * const”定义pointer_traits?

时间:2013-03-13 12:23:59

标签: c++ pointers c++11

正如在http://en.cppreference.com/w/cpp/memory/pointer_traits和相关网站上看到的那样(也是通过提升侵扰的提升实施),pointer_traits并非专门用于T*const。那是为什么?

1 个答案:

答案 0 :(得分: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提供专业化。