我正在尝试做的事情:
我正在使用的代码不是我的,因此我试图对其进行重构。那里有一个结构类型对象,我们称之为 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”的操作数(或没有可接受的转换)
您是否知道为什么或这里发生了什么?
答案 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::fill
和std::fill_n
计入对象而不是字节是完全错误的(除非偶然sizeof(MyStruct)==1
,但即使那样,它也是一个等待发生的错误)。
我试图将memset更改为更c ++的标准方法,即fill或fill_n
std::fill
和std::fill_n
是将新值分配给值序列的C ++方法,而不是memset
的C ++版本。 memset
的C ++版本是memset
!
如果您不尝试重置该结构的值,只需对其进行初始化,那么正确的方法就是:
MyStruct s = { };
这是完全有效的C ++,可以在从C ++ 98到最新标准的任何版本中使用。与使用memset
相比,这更简单,安全和可读。