c – 什么特性/概念可以保证memsetting一个对象是明确定义的?

假设我已经定义了一个zero_initialize()函数:

template<class T>
T zero_initialize()
{
    T result;
    std::memset(&result, 0, sizeof(result));
    return result;
}

// usage: auto data = zero_initialize<Data>();

为某些类型调用zero_initialize()会导致未定义的行为1,2.我目前正在强制执行T来验证std::is_pod.在C 20中不推荐使用该特性以及概念的来临,我很好奇零_initialize()应该如何演变.

>什么(最小)特征/概念可以保证memsetting一个对象是明确定义的?
>我应该使用std::uninitialized_fill而不是std :: memset吗?为什么?
>对于类型子集,此函数是否已被C初始化语法之一淘汰?或者它将与即将到来的未来C版本一起使用?

1)Erase all members of a class.
2)What would be reason for “undefined behaviors” upon using memset on library class(std::string)? [closed]

解决方法:

在技​​术上,C中没有对象属性,它指定用户代码可以合法地设置C对象.这包括POD,所以如果你想成为技术人员,你的代码永远不会正确.甚至TriviallyCopyable也是关于在现有对象之间进行逐字节复制的属性(有时通过中间字节缓冲区);它没有说明发明数据并将其推入对象的位.

话虽如此,如果您测试is_trivially_copyable和is_trivially_default_constructible,您可以合理地确定这将有效.最后一个很重要,因为一些TriviallyCopyable类型仍然希望能够控制它们的内容.例如,这样的类型可以有一个始终为5的私有int变量,在其默认构造函数中初始化.只要没有访问变量的代码改变它,它就会一直是5.C对象模型保证了这一点.

所以你不能忘记这样的对象,仍然可以从对象模型中获得明确定义的行为.

上一篇:JavaBean规范是否已更新以反映注释的存在


下一篇:c-可变参数模板异构容器