采用以下代码:
std::vector<std::vector<int>> v(10, 10);
此代码无法使用 libstdc++ 进行编译。但是,它确实可以使用 Visual Studio 的 C++ 库进行编译。我期望的行为是 v
填充了 10 个大小为 10 的 vector ,这就是我在 Visual Studio 中得到的结果。
使用 Visual Studio 调用的构造函数是采用两个迭代器的构造函数。构造函数本身定义为:
template<class _Iter>
vector(_Iter _First, _Iter _Last)
: _Mybase()
{ // construct from [_First, _Last)
_Construct(_First, _Last, _Iter_cat(_First));
}
模板函数 _Construct
有两个版本。两者具有相同的签名,但一个从一个范围初始化 vector ,另一个从第二个参数构造的值类型拷贝的 N 个拷贝初始化 vector 。在这种情况下,模板参数仅对 _Construct
的第二个版本有效。
结果是 v
填充了从值 10 复制构造的 vector 的 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);
这不应该编译,因为 vector 的单参数构造函数是显式的。
C++03:
explicit vector(size_type n, const T& value = T(), const Allocator& = Allocator());
C++11:
explicit vector(size_type n);
这意味着像 10 这样的数字不能隐式转换为大小为 10 的 vector 。
关于c++ - std::vector 构造函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7700123/