为啥没有为“T* const”定义pointer_traits?
Posted
技术标签:
【中文标题】为啥没有为“T* const”定义pointer_traits?【英文标题】:Why is pointer_traits not defined for "T* const"?为什么没有为“T* const”定义pointer_traits? 【发布时间】:2013-03-13 12:23:59 【问题描述】:正如在 http://en.cppreference.com/w/cpp/memory/pointer_traits 和相关网站上看到的(也是 boost intrusive 的 boost 实现),pointer_traits
不是专门针对 T*const
的。这是为什么呢?
【问题讨论】:
我会说因为它适用于您存储指针的变量,而不是逻辑指针实体本身。指针的属性/特征如何存储它并不重要。 我认为这对于重新绑定尤其必要,std::pointer_traits<T*>::rebind<void>
应该保留T
的常量,即根据T
赋予void*
或void const*
。
【参考方案1】:
虽然这不能作为强烈的动机反对指定应该存在T* const
的pointer_traits<>
的专业化,但我想解释为什么不包括它可能是pointer_traits<>
主要用于模板参数推导(尤其是类型推导)发生的上下文中。
由于类型推导无视*** cv 资格,因此可能认为没有必要专门化 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
。
【讨论】:
我有一个foo(T&)
类型的函数模板,它会触发:(
@Johannes:是的,在这种情况下,*** cv 限定符不会被忽略。只是为了澄清,我只是试图对为什么不存在专业化给出一个可能的解释;我并不是在提倡它不应该存在(事实上,实现似乎为shared_ptr<>
提供了它)。
在foo(T&)
中,T
上的限定符不是***的,&
是***的,并且任何 cv 限定符都是“向下一级”
@JonathanWakely 在foo(T&)
中,T
是int *const
(有一个***常量),这是我想指出的。那里的 const 并没有像 foo(T)
那样被删除。请注意,在 foo(T&)
中,T
没有 &
。只有参数类型才有它。
我在回复 Andy 的评论:“是的,这是一种不忽略*** cv 限定符的情况。”这是错误的,没有 /i> foo(int* const&)
中的*** cv-qual 所以说它没有被忽略是不准确的。以上是关于为啥没有为“T* const”定义pointer_traits?的主要内容,如果未能解决你的问题,请参考以下文章
强制定义 Go 结构以将 unsafe.Pointer() 转换为 C 结构
为啥同样的C程序在VC++6.0可以运行,在VS2010就不可以?