草庐IT

c++ - 我可以将 final 关键字应用于 C++11 中的 POD(标准布局)结构吗?我是不是该?

在一个充满对象(具有适当行为)和相对较少的非面向对象结构(仅由数据字段和无方法组成)的C++项目中,我想防止意外误用这些结构,其中可能会尝试创建一个继承自它的类。根据我的理解,因为这些“POD”(普通旧数据)结构没有虚拟析构函数,所以不可能通过指针正确删除派生类对象(如果允许创建它)POD类型。这似乎是C++11“final”关键字的一个很好的用例,它将一个类或结构标记为不可继承。但是,我想知道“final”关键字是否会导致结构变为非POD?我怀疑标准文档可能已经解决了这个问题,但我不够聪明,无法在很长的文档中进行筛选以找出答案。欢迎任何有用的指示。注意:我对仅仅知道它通过了某些编译器

c++ - POD的零初始化

structLine{Boundsbounds_;Vectororigin_;uint32_tbegin_;uint32_tend_;distascent_;distdescent_;};使用方法如下:Lineline={};while(!parser.done()){line=Line();//zero-initialize...}Bounds和Vector是非POD类,dist是int64_t的类型定义。但是,优化的32位VC++11发布版本似乎在while循环中至少留下了line的部分未初始化。为什么?根据Dotheparenthesesafterthetypenamemakea

如何在本地生成导入的POD的文档

剧本buildwebdocs.fan为发行版的豆荚生成文档,但没有为我自己或进口的豆荚生成文档。如何在本地生成本pods的文档?看答案您可以调用compilerDoc你自己:$fancompilerDoc-?Usage:compilerDoc[options]*Arguments:podsNameofpodstocompile(doesnotupdateindex)Options:-help,-?Printusagehelp-allGeneratedocsforeveryinstalledpods-allCoreGenerationdocsforFantomcorepods-cleanDele

c++ - 从函数返回一个不可变的 POD 类

上下文我正在从事一个由不同模块组合而成的大型项目。我们有一个exporter具有模板功能export(constT&obj)它仅适用于POD类型(如果您好奇,它会为static_assert执行is_pod)。目前,我负责对元数据描述的一些实体(它们的类型无关)进行编目。元数据本身由一些名为metadatadescribe(constentity&obj)的函数返回。,返回后应该是不可变的。当然函数本身设置了metadata它体内的成员。问题由于上述事实,我需要设计一个constPOD类型。由于POD类型cannothaveuser-definedconstructors,成员变量本身

C++11 is_pod 与 GCC 4.6

在relaxeddefinitionofPOD下在C++11中,我的理解是以下结构被视为POD:templatestructFoo{Foo(){}explicitFoo(T*obj):m_data(obj){}T*m_data;};但是,使用GCC4.6并使用-std=c++0x标志进行编译,如果我说:std::cout>::value输出:false这是一个ideonelink显示完整的程序。(注意ideone使用的是GCC4.5)那么,我对C++11中POD的理解是错误的,还是GCC4.6在C++11合规性方面根本不是最新的? 最佳答案

c++ - 如何在 std::map 中尝试放置 POD 结构?

我有一张int->{basictypes}的map,我需要存储。我想简单地创建一个struct{intf1,intf2;};并直接存储值,在存储过程中就地构造结构。我不希望有任何重复的键,所以try_emplace看起来很理想。我写了这段代码://mcve.cpp#include#includestructvarious{intf1,f2;};usingmap_t=std::map;voidexample(){map_tdict;//dict.try_emplace(1,2);dict.try_emplace(1,1,2);//dict.try_emplace(1,{1,2});}但是

c++ - 仅用于基本 POD 的模板特化

模板特化是否有一个微妙的技巧,以便我可以将一种特化应用于basicPOD(当我说basicPOD时,我并不是特别想要structPOD(但我会接受)).templatestructDoStuff{voidoperator()(){std::coutstructDoStuff{voidoperator()(){std::cout或者我是否必须为每个内置类型编写特化?templatestructDoStuff{voidoperator()(){std::coutstructDoStuff{voidoperator()(){std::cout单元测试。intmain(){DoStuffint

c++ - POD成员默认初始化不带大括号

给定代码:structTest{inta=1;intb=2;};Testtest1;Testtest2{};对于test2,我确定test2.a==1和test2.b==2。test1(没有{})是否保证(或不)相同? 最佳答案 线Testtest1;等同于使用默认构造函数进行初始化,如果没有带有显式初始化列表且没有Test()=deleted;的手写构造函数,最终将设置两个成员为其指定的初始值1和2。“默认构造函数”是可以不带参数调用的构造函数,这正是上述语句的情况。您可以在standard中阅读默认构造函数的规则。-转到§12.

c++ - 具有所有私有(private)成员的类可以是 POD 类吗?

我之前听说POD类型不能有私有(private)数据——但根据C++0x草案,我的要求更宽松(强调我的):hasthesameaccesscontrol(Clause11)forallnon-staticdatamembers这似乎表明只要私有(private)数据都是私有(private)的就可以。我没有C++03的拷贝,但要检查...那么,WindowsApi::Uuid会是一个POD类吗?namespaceWindowsApi{classUuid{union{::UUIDasUuid;//Win32'sUUIDstructunsigned__int64asInt64s[2];un

c++ - 用 std::valarray 替换 POD C 样式数组是个坏主意吗?

我正在使用一个编写不当且存在大量内存泄漏的代码库。它使用了很多包含原始指针的结构,这些结构主要用作动态数组。虽然结构经常在函数之间传递,但这些指针的分配和释放是随机放置的,不容易跟踪/推理/理解。我将其中一些更改为类,并将这些指针更改为类本身的RAIIed。它们运行良好并且看起来并不难看,只是我禁止了这些类的复制构造和复制分配只是因为我不想花时间实现它们。现在我在想,我是不是在重新发明轮子?为什么不用std:array或std::valarray替换C风格的数组?我更喜欢std::valarray,因为它使用堆内存和RAIIed。std::array在我的开发环境中(还)不可用。Edi