为啥 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);
其中reference
和size_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>>::pointer
与T*
的类型相同,所以没有区别。
但是对于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()?