为什么valarray分配不会根据文档调整受让人的大小?

时间:2015-08-06 22:18:18

标签: c++ assignment-operator valarray

代码:

#include <valarray>
#include <iostream>    

using namespace std;

int main()
{
  valarray<int> v0(2, 4);
  valarray<int> v1;
  v1 = v0;
  cout << "v0.size: " << v0.size() << endl;
  cout << "v1.size: " << v1.size() << endl;
  cout << "v0[0]: " << v0[0] << endl;
  cout << "v1[0]: " << v1[0] << endl;
}

输出:

v0.size: 4
v1.size: 0
v0[0]: 2
Segmentation fault

对于作业:

v1 = v0;

我认为构造函数:

valarray<T>& operator=( const valarray<T>& other );
应该使用

并且根据documentation,我相信应该调整v1的大小并将v0的内容复制到其中,元素的元素。那么实际发生了什么?

$ g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)

1 个答案:

答案 0 :(得分:6)

因为您使用的是旧版C ++。

从C ++ 11开始,目的地的大小调整以匹配来源。
这就是为什么这里的一些贡献者无法重现你的问题(另外,UB有不可预测的结果)。 这也是为什么the cppreference.com article states that a resize is first performed(虽然免责声明,因为C ++ 11可能很好,但这只适用于此。) [现在已经修复了。] < / p>

  

[C++11: 23.6.2.3] valarray任务[valarray.assign]

     

valarray<T>& operator=(const valarray<T>& v);

     

1 *this数组的每个元素都被赋予参数数组的相应元素的值。如果v的长度不等于*this的长度,请调整*this的大小以使两个数组的长度相同,就像调用resize(v.size())一样,然后执行分配

     

2 后置条件:size() == v.size()

但是,在C ++ 03中,您的代码具有未定义的行为。
这就是为什么你的旧工具链出现分段错误的原因。这也是为什么,当这个问题在2003年被提出为a GCC bug时,它被拒绝为无效,因为当时实现实际上是符合的。

  

[C++03: 23.3.2.2] valarray任务[valarray.assign]

     

valarray<T>& operator=(const valarray<T>& v);

     

1 *this数组的每个元素都被赋予参数数组的相应元素的值。如果参数数组的长度不等于*this数组的长度,则结果行为是未定义的。