如果向量为空,std::vector::data() 应该返回什么?

2024-03-10

根据标准草案(23.3.6.4 矢量数据 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf), 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

但如果向量为空怎么办?当我构建零大小向量时:

#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;
}

MSVC 2010 返回 null,但在 Linux(使用 GCC 4.2.1 和 Intel 12.1)上我得到一个非空地址。

Is vector::data()允许还是应该返回 null?例如,一个实现是否可以进行默认大小的初始分配并返回指向它的(非空)指针?

Edit:有几个答案集中在空范围的有效性上。我完全同意这一点。

我真的很想看到一个很好的参考或解释:是吗?被允许, must it返回空值或may it也返回非空?


范围的约定是[inclusive, exclusive),也就是说如果你迭代一个范围[X,Y)您将在概念上执行以下操作(伪代码):

for( iterator ii = X; ii != Y; ++ii) {
...
}

这允许将空范围表示为[X,X)。这个空范围也被完美地定义为每个地址,无论有效还是无效。

这就是说的要求data() are (强调我的):

23.3.6.4 [矢量.数据]

T* data() noexcept;

const T* data() const noexcept;

返回: 一个指针,使得[data(),data() + size()) 是有效范围。为一个 非空向量,data() == &front()。

在我看来,唯一无条件的保证就是[data(),data() + size())应该是一个有效范围。为了size() == 0成员函数data()可以返回任何值,并且范围将是有效的空范围。因此我想说如果满足以下条件,则允许实现返回非空指针:size() is zero.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果向量为空,std::vector::data() 应该返回什么? 的相关文章

随机推荐