为啥没有为“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* constpointer_traits<> 的专业化,但我想解释为什么不包括它可能是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&lt;&gt; 也没有专门用于 T* cv

【讨论】:

我有一个foo(T&amp;) 类型的函数模板,它会触发:( @Johannes:是的,在这种情况下,*** cv 限定符不会被忽略。只是为了澄清,我只是试图对为什么不存在专业化给出一个可能的解释;我并不是在提倡它不应该存在(事实上,实现似乎为shared_ptr&lt;&gt;提供了它)。 foo(T&amp;) 中,T 上的限定符不是***的,&amp; 是***的,并且任何 cv 限定符都是“向下一级” @JonathanWakely 在foo(T&amp;) 中,Tint *const(有一个***常量),这是我想指出的。那里的 const 并没有像 foo(T) 那样被删除。请注意,在 foo(T&amp;) 中,T 没有 &amp;。只有参数类型才有它。 我在回复 Andy 的评论:“是的,这是一种不忽略*** cv 限定符的情况。”这是错误的,没有 /i> foo(int* const&amp;) 中的*** cv-qual 所以说它没有被忽略是不准确的。

以上是关于为啥没有为“T* const”定义pointer_traits?的主要内容,如果未能解决你的问题,请参考以下文章

强制定义 Go 结构以将 unsafe.Pointer() 转换为 C 结构

为啥同样的C程序在VC++6.0可以运行,在VS2010就不可以?

为啥没有用户代理为视频元素实现 CSS 光标样式

为啥 __dirname 没有在节点 REPL 中定义?

为啥定义没有 CUDA __device__ 属性的类头有效? (C++)

为啥`-fno-omit-frame-pointer` 会干扰 ASAN?