为什么std::vector::resize(n, src)按值传递?

Why does std::vector::resize(n, src) pass by value?

本文关键字:src 按值传递 std vector resize 为什么      更新时间:2023-10-16

与标题基本一致。

std::vector<T>::resize的规范似乎要求src对象通过value传递:

void resize(size_type n, T src = T() );

为什么这里不使用对常量对象的引用呢?

void resize(size_type n, T const& src = T() );

例如,在这个问题中,由于在堆栈上创建临时对象,按值传递方面似乎会导致stackoverflow问题。

如果传递了对src的引用,我们至少可以通过在堆上分配一个按引用传递给::resize()的临时内存来解决这个问题。

似乎::resize()std::vector的其他成员函数不一致。例如,构造函数按预期接受const&src对象:

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

编辑:我挖出了c++03标准,并仔细检查了上面的函数原型没有被错误引用…

这是标准库规范中的错误。它在c++ 11中被修复了;std::vector现在有两个resize成员函数声明为:

void resize(size_type sz);
void resize(size_type sz, const T& c);

两者的区别在于,如果在调整大小后容器的大小更大,则第一个重载值初始化新元素,而第二个重载值则构造新元素;此模式也用于其他成员函数和其他容器。