【问题标题】: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*

标签: c++ pointers c++11


【解决方案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 所以说它没有被忽略是不准确的。
猜你喜欢
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
相关资源
最近更新 更多