Namespaces
Variants

std:: pointer_traits

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
std::pointer_traits
Member functions
(C++20) (optional)
定义于头文件 <memory>
template < class Ptr >
struct pointer_traits ;
(1) (C++11 起)
template < class T >
struct pointer_traits < T * > ;
(2) (C++11 起)

pointer_traits 类模板提供了标准化的方式来访问指针类类型的某些属性( 花式指针 ,例如 boost::interprocess::offset_ptr )。标准模板 std::allocator_traits 依赖 pointer_traits 来确定 Allocator 所需的各种类型别名的默认值。

1) 非特化的 pointer_traits 有条件地声明以下成员:

/*element-type-of*/ < Ptr >

  • 若存在则为 Ptr :: element_type
  • 否则,若 Ptr 是类模板特化 Template < T, Args... > (其中 Args... 是零个或多个类型参数)则为 T
  • 否则未定义。

/*element-type-of*/ < Ptr > 未定义,则主模板不包含本页指定的成员。

目录

成员类型

类型 定义
pointer Ptr
element_type /*element-type-of*/ < Ptr >
difference_type 若存在则为 Ptr :: difference_type ,否则为 std::ptrdiff_t

成员别名模板

模板 定义
template < class U > using rebind 若存在则为 Ptr :: rebind < U > ,否则若 Ptr 是模板特化 Template < T, Args... > 则为 Template < U, Args... >

成员函数

[静态]
获得指向其参数的可解引用指针
(公开静态成员函数)
2) 为指针类型 T * 提供了特化,该特化声明了以下成员:

成员类型

类型 定义
pointer T *
element_type T
difference_type std::ptrdiff_t

成员别名模板

模板 定义
template < class U > using rebind U *

成员函数

[static]
获取指向其参数的可解引用指针
(公开静态成员函数)

程序定义特化的可选成员函数

[静态] (C++20) (可选)
从智能指针获取原始指针( pointer_to 的逆操作)
(公开静态成员函数)

注释

rebind 成员模板别名使得在给定指向 T 的指针式类型时,能够获取指向 U 的相同指针式类型。例如,

using another_pointer = std::pointer_traits<std::shared_ptr<int>>::rebind<double>;
static_assert(std::is_same<another_pointer, std::shared_ptr<double>>::value);
(注:根据要求,代码块内的C++代码和HTML标签均未翻译,仅对说明性文字进行翻译。原内容为纯代码片段,无需要翻译的自然语言文本)

针对用户定义花式指针类型的特化可提供额外的静态成员函数 to_address ,以定制 std::to_address 的行为。

(since C++20)
功能测试 标准 功能
__cpp_lib_constexpr_memory 201811L (C++20) constexpr in std::pointer_traits

示例

#include <iostream>
#include <memory>
template<class Ptr>
struct BlockList
{
    // 预定义内存块
    struct block;
    // 根据指针类型 Ptr 定义指向内存块的指针类型
    // 若 Ptr 为任意类型的 T*,则 block_ptr_t 为 block*
    // 若 Ptr 为 smart_ptr<T>,则 block_ptr_t 为 smart_ptr<block>
    using block_ptr_t = typename std::pointer_traits<Ptr>::template rebind<block>;
    struct block
    {
        std::size_t size{};
        block_ptr_t next_block{};
    };
    block_ptr_t free_blocks;
};
int main()
{
    [[maybe_unused]]
    BlockList<int*> bl1;
    // bl1.free_blocks 的类型是 BlockList<int*>::block*
    BlockList<std::shared_ptr<char>> bl2;
    // bl2.free_blocks 的类型是
    // std::shared_ptr<BlockList<std::shared_ptr<char>>::block>
    std::cout << bl2.free_blocks.use_count() << '\n';
}

输出:

​0​

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 适用范围 发布时的行为 正确行为
LWG 3545 C++11 element_type 无效时,主模板会导致硬错误 改为支持SFINAE

参见

提供分配器类型的相关信息
(类模板)
(C++11)
获取对象的实际地址,即使 & 运算符已被重载
(函数模板)