c++ - std::vector 构造函数行为

标签 c++ standards-compliance msvcrt libstdc++ c++-standard-library

采用以下代码:

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/

相关文章:

html - 一个 HTML 元素可以有多个 id 吗?

winapi - 为什么_get_heap_handle 等于GetProcessHeap?

linux - 为什么CRT要与内核分离?

c++ - gdb 调用函数 - 如何使用 std::cout 作为参数?

c++ - 分析由于 Java 进程中的 C++ 对象导致的内存增长

c++ - 在 api 中检索 Maya 着色器的颜色

c++ - 将vector <int8>转换为vector <uint8>

strtol 等规范中的混淆语言

c++ - 将 int 重新解释为 float 的最有效的标准兼容方式

windows - 我应该使用我的应用程序重新分发 msvcrt.dll 吗?