正如在http://en.cppreference.com/w/cpp/memory/pointer_traits和相关网站上看到的(也是 boost intrusive 的 boost 实现),pointer_traits
不是专门用于T*const
. 这是为什么?
问问题
351 次
1 回答
8
尽管这不能作为反对指定pointer_traits<>
for的专门化T* const
存在的强烈动机,但我想一个解释为什么不包括它可能pointer_traits<>
是主要用于模板参数推导(特别是类型推导)的上下文中) 发生。
由于类型推导忽略了顶级 cv-qualifications,因此 or 或 or 的专门化T* const
可能T* volatile
被T* 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
。
于 2013-03-13T12:46:56.873 回答