根据标准草案(23.3.6.4向量数据),data()指向底层数组,并且[data(), data() + size())必须是有效范围:
T* data() noexcept;
const T* data() const noexcept;
1 Returns: A pointer such that [data(),data() + size()) is a valid range. For a non-empty vector,
data() == &front().
2 Complexity: Constant time
Run Code Online (Sandbox Code Playgroud)
但是如果向量是空的呢?当我构造一个零大小的向量时:
#include <vector>
#include <iostream>
int main() {
const int NUM = 0*10;
std::vector< double > v( NUM, 0.0 );
std::cerr << "V : "<< v.data() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
MSVC 2010返回null,但在Linux(使用GCC 4.2.1和Intel 12.1)上,我得到一个非空地址.
是vector::data()允许还是应该返回null?例如,一个实现可以执行默认大小的初始分配并返回一个(非空)指针吗?
编辑:几个答案集中在空范围的有效性.我完全同意.
我真的希望看到一个很好的引用或解释:是否允许 …
我很好奇这种事情是否合法:
std::vector<some_class_type> vec;
vec.reserve(10);
some_class_type* ptr = vec.data() + 3; // that object doesn't exist yet
Run Code Online (Sandbox Code Playgroud)
请注意,我没有尝试访问指向的值.
这是标准所说的data(),但我不确定它是否相关:
返回:指针,这
[data(),data() + size())是一个有效的范围.对于非空向量,data() == &front().