为啥 std::vector::data() 中没有使用指针 typedef?

Posted

技术标签:

【中文标题】为啥 std::vector::data() 中没有使用指针 typedef?【英文标题】:Why is the pointer typedef not used in std::vector::data()?为什么 std::vector::data() 中没有使用指针 typedef? 【发布时间】:2015-07-23 10:47:47 【问题描述】:

在 std::vector 的 API 中有一些 typedef 和许多返回这些 typedef 的函数。

例如

reference operator[](size_type n);

其中referencesize_type 是类型定义。

有一个pointer 的typedef,它是从它的分配器模板参数中获得的。为什么data()的函数签名是这样的:

T* data() noexcept;

而不是:

pointer data() noexcept;

这背后有什么原因吗?还有为什么是T*而不是value_type*

如果你想检查它是我拥有的标准的第 23.3.6.4 节。

【问题讨论】:

【参考方案1】:

data() 存在的原因是为了获取指向向量内底层数组的指针,以便(例如)您可以将它传递给使用指针而不是迭代器的 API。

pointer typedef 不一定是真正的指针类型,它是 std::allocator_traits<allocator_type>::pointer 的 typedef,它可能是某种行为类似于指针的类类型(有时称为“花式指针”)。

默认情况下std::vector<T>std::vector<T, std::allocator<T>>std::allocator_traits<std::allocator<T>>::pointerT*的类型相同,所以没有区别。

但是对于std::vector<T, CustomAllocator<T>>,如果data() 返回pointer,您将无法将其传递给期望T* 的函数,除非is_same<pointer, T*>::value 为真。

【讨论】:

另见 LWG 问题1312(这是更改的地方) 我明白了,这是因为如果它返回 pointer ,它的 C 互操作性就会被破坏。因为这就是函数的原因,所以这是有道理的。谢谢。 对,虽然它不仅仅是 C 互操作性。也有处理原始指针的 C++ API。

以上是关于为啥 std::vector::data() 中没有使用指针 typedef?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 volatile 在多线程 C 或 C++ 编程中没有用?

为啥 nib 文件中的 UITableViewCell(加载并添加到堆栈)在 viewDidAppear 中为零,但在 viewDidLoad 中没问题?

linux sudoers 中没有的用户为啥可以使用sudo权限

为啥我不能在我的 docker 容器中运行 phpinfo()?

thinkphp5里面.htaccess文件为空为啥也能隐藏入口文件?

SSAS:我的维度表可以包含事实表中没有的键吗?