C ++ std :: fill和std :: fill_n错误“错误C2679”

时间:2018-08-13 08:15:14

标签: c++ visual-studio-2010 c++11 std

我正在尝试做的事情:

我正在使用的代码不是我的,因此我试图对其进行重构。那里有一个结构类型对象,我们称之为 MY_STRUCTURE ,其中包含一些参数。在该代码的旧版本中,他们使用memset将所有参数中的结构初始化为0。因此,我尝试将memset更改为更c ++的标准方法,即fill或fill_n。

另外,我应该提到...没有数组,只是一个对象,所以我要做的就是在所有地方都用0初始化该对象。

完美运行的memset方法看起来像

this:memset(&MyScruct, 0, sizeof(MyScruct));

我尝试过什么:

我试图像这样使用fill和fill_n之一:

std::fill(&MyScruct, &MyScruct+ sizeof(MyScruct), 0);

还有

std::fill_n(&MyScruct, sizeof(MyScruct), 0);

其中MyScruct是MY_STRUCT MyScruct

在这两种情况下,我都会遇到相同的错误:

  

错误C2679:二进制'=':找不到使用右手的运算符   类型为“ const int”的操作数(或没有可接受的转换)

您是否知道为什么或这里发生了什么?

2 个答案:

答案 0 :(得分:3)

如果代码是用memset正确编写的,则没有理由对其进行更改。 fill不能代替memset

在现代C ++中,设计一个需要memset的类会很不好。但是,如果您正在使用以这种方式设计的其他人的类,则按设计的方式使用他们的类是正确的。


在现代C ++中,您将设计类,以便值初始化将其重置:

MyScruct = MY_STRUCT{};

取决于memset的详细信息,此代码可能与MY_STRUCT具有相同的效果。

答案 1 :(得分:1)

在原始代码中,memset将完全忽略类型系统,仅将字节写入原始内存,从而浪费掉之前的所有内容(并且我不得不质疑“ memset方法是否能正常工作很好” 实际上工作正常,或者实际上是未定义的。

另一方面,std::fill与类型系统一起使用,并设置正确类型的值。 0不是正确类型的值(并且不能分配给该类型),因此您不能用零“填充”该结构。

  

没有数组,只是一个对象

然后,您确定肯定不想传递sizeof(MyStruct),因为这表示要“填充”多少个类型的对象。您只有一个对象,而没有包含sizeof(MyStruct)个元素的数组。

sizeof(MyStruct)memset的正确参数,因为它适用于字节而不是对象。您需要告诉memset要写入多少字节。但是对于std::fillstd::fill_n计入对象而不是字节是完全错误的(除非偶然sizeof(MyStruct)==1,但即使那样,它也是一个等待发生的错误)。

  

我试图将memset更改为更c ++的标准方法,即fill或fill_n

std::fillstd::fill_n是将新值分配给值序列的C ++方法,而不是memset的C ++版本。 memset的C ++版本是memset

如果您不尝试重置该结构的值,只需对其进行初始化,那么正确的方法就是:

MyStruct s = { };

这是完全有效的C ++,可以在从C ++ 98到最新标准的任何版本中使用。与使用memset相比,这更简单,安全和可读。