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对象模型保证了这一点.
所以你不能忘记这样的对象,仍然可以从对象模型中获得明确定义的行为.
标签:c20,c,c14,metaprogramming,sfinae 来源: https://codeday.me/bug/20191005/1856383.html