std::向量构造函数行为

std::vector constructor behavior

本文关键字:向量 std 构造函数      更新时间:2023-10-16

获取以下代码:

std::vector<std::vector<int>> v(10, 10);

此代码不使用libstdc++进行编译。不过,它确实使用Visual Studio的C++库进行编译。我所期望的行为是v填充了10个大小为10的向量,这就是我在Visual Studio中得到的结果。

用VisualStudio调用的构造函数使用两个迭代器。构造函数本身定义为:

template<class _Iter>
vector(_Iter _First, _Iter _Last)
    : _Mybase()
{   // construct from [_First, _Last)
    _Construct(_First, _Last, _Iter_cat(_First));
}

模板函数_Construct有两个版本。两者都有相同的签名,但其中一个从一个范围初始化向量,另一个用从第二个参数构造的值类型副本的N个副本初始化向量。在这种情况下,模板参数仅对_Construct的第二版本有效。

结果是CCD_ 4填充有根据值10复制构建的向量的10个副本。通过这样构建它可以获得相同的代码路径,因为您必须使用libstdc++:才能获得相同的效果

std::vector<int> temp(10);
std::vector<std::vector<int>> v(10, temp);

这里哪种实现是正确的?这是libstdc++错误还是Visual Studio C++库的扩展?

编辑:只是澄清一下,我不是在问它是否应该调用范围构造函数。我在问哪个C++实现具有正确的行为,而不管它需要哪条路径来实现。

std::vector<std::vector<int>> v(10, 10);

这不应该编译,因为向量的单参数构造函数是显式的。

C++03:

explicit vector(size_type n, const T& value = T(), const Allocator& = Allocator());

C++11:

explicit vector(size_type n);

这意味着像10这样的数字不能隐式地变成大小为10的向量。

我所期望的行为是,v填充了10个大小为10 的矢量

这正是GCC/libstdc++4.1.2发生的情况。被称为的_Construct

void std::_Construct<std::vector<int>, int>(std::vector<int>*, int const&)

(省略分配器(。我不能告诉你这个标准是怎么说的,但我的直觉是,这是旧的GCC/libstdc++中的一个错误。