C++ 为什么std::vector::data()中没有使用指针typedef?

C++ 为什么std::vector::data()中没有使用指针typedef?,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,在std::vector的API中有一些typedef和许多返回这些typedef的函数 e、 g 其中,reference和size\u type是typedef 有一个typedef的指针,它从分配器模板参数中获取。为什么data()的函数签名是这样的: T* data() noexcept; 而不是: pointer data() noexcept; 这背后有什么道理吗?还有为什么它是T*而不是value\u type* 如果您想检查它是否是我拥有的标准的第23.3.6.4节。存在da

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

e、 g

其中,
reference
size\u type
是typedef

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

T* data() noexcept;
而不是:

pointer data() noexcept;
这背后有什么道理吗?还有为什么它是
T*
而不是
value\u type*

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

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

指针
typedef不一定是真正的指针类型,它是std::allocator\u traits::pointer的typedef,可能是某种行为类似指针的类类型(有时称为“花式指针”)

对于默认情况,
std::vector
std::vector
,而
std::allocator\u traits::pointer
是与
T*
相同的类型,因此没有区别


但对于
std::vector
而言,如果
data()
返回了一个
指针
,您将无法将其传递给一个需要
T*
的函数,除非
是相同的::值
是真的。

另请参阅LWG问题(这是更改的地方)我明白了,这是因为如果它返回
指针
,那么它的C互操作性将被破坏。因为这是函数的原因,所以这是有意义的。谢谢。是的,尽管这不仅仅是C语言的互操作性。也有C++ API来处理原始指针。
pointer data() noexcept;