为什么std::vector::resize(n, src)按值传递?
Why does std::vector::resize(n, src) pass by value?
与标题基本一致。
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);
两者的区别在于,如果在调整大小后容器的大小更大,则第一个重载值初始化新元素,而第二个重载值则构造新元素;此模式也用于其他成员函数和其他容器。
相关文章:
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- C++类 - 初始化列表 - 递归 - 按值传递
- 将函数参数完美转发到函数指针:按值传递呢?
- 棘手的按值传递和按引用递归问题传递
- 不同于按值传递和常量引用传递的程序集
- 按值传递变量与按引用传递变量具有相同的结果
- 为什么按值传递QStringView比引用常量更快?
- 获取 std::函数以推断按引用传递/按值传递
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 防止在按值传递对象(继承)时进行切片
- 按值传递类和结构
- C++按引用传递还是按值传递?
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 可移动但不可复制的对象:按值传递还是按引用传递?
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 在C++中指针是按值传递的吗
- shared_ptr构造函数参数是否应按值传递
- 为什么std::vector::resize(n, src)按值传递?