社区首页 >问答首页 >是否有比类更倾向于非POD结构的有效用例?

是否有比类更倾向于非POD结构的有效用例?
EN

Stack Overflow用户
提问于 2012-02-23 17:48:43
回答 2查看 896关注 0票数 0

根据(2003)标准对结构的定义,它是类的特殊情况,成员、函数和基类具有不同的默认访问修饰符。它还将结构的要求定义为POD-struct。

C++ 2003标准,ISO 14882第9.0.4节:

A结构是用类键结构定义的类;默认情况下,它的成员和基类(子句10)是公共的(第11条)。联合是一个用类键联合定义的类;它的成员在默认情况下是公共的,并且一次只能容纳一个数据成员(9.5)。注意: 8.5.1中描述了类类型的聚合。POD-struct是一个聚合类,它没有非POD-struct类型的非静态数据成员、非POD-并(或此类类型的数组)或引用,并且没有用户定义的复制赋值操作符和用户定义的析构函数。类似地,POD-union是一个聚合联合,它没有非POD-struct类型的非静态数据成员、非POD-并(或此类类型的数组)或引用,并且没有用户定义的复制赋值操作符和用户定义的析构函数。POD类是一个POD-结构类或POD-结合类.

根据这个定义,非POD结构和类之间唯一的区别因素是默认的访问修饰符。

下面是我可以想象到的非POD结构的目的:

backwards-compatibility

  • Typing

  • 是一个需要维护的遗留特性,public:很难维护。

当非POD结构被其他系统假定为POD时,可能会导致疼痛,例如,当它们被传递到C和后面时。为了说明,this person ran into problems when a struct that was assumed to be POD was updated by another developer such that it was no longer POD。由于编译器在默认情况下不会静态断言POD-ness,所以当只能使用POD结构的上下文中使用该结构时,应用程序将在运行时崩溃。更糟糕的是,我可以想象(虽然我不确定这是否可能),一个非POD结构在某些需要POD的情况下工作,而在其他情况下失败,导致错误和崩溃,而这些错误和崩溃都是很难追踪的。

既然有些情况下,非POD结构会导致行为的奇异和破碎,那么非POD结构又有什么用呢?为什么结构在编译时没有静态地检查POD(通过std::is_pod在C++11或Boost等效项)?

EN

回答 2

Stack Overflow用户

发布于 2012-02-23 17:56:14

我认为这是一个毫无意义的历史意外,坦率地说,class关键字根本不应该在C++中添加。哦,好吧!

如果struct被要求是POD的话,这通常会很烦人--你通常会从一些POD开始,仅仅因为你可以就把它叫做"struct“,然后当你决定让它成为非POD的时候,就不得不在很多地方改变它。

请注意,GCC (至少直到最近)并不关心您(前进)是否在一个地方将某物声明为一个类,而在其他地方将其声明为一个结构,反之亦然。Clang抱怨这类事情(因为它完全有权这样做,尽管这确实“破坏”了一些现有的代码)。

票数 4
EN

Stack Overflow用户

发布于 2012-02-23 18:05:16

默认情况下,编译器不会静态断言

“POD”。

噢?

代码语言:javascript
代码运行次数:0
复制
#include <iostream>         // std::cout, std::endl
#include <type_traits>      // std::is_pod
#include <string>           // std::string, std::to_string
using namespace std;

struct A
{
    int x;
};

struct B
{
    string s;
};

int main()
{
    static bool const a = is_pod<A>::value;
    static_assert( a, "Ah..." );
    static_assert( !is_pod<B>::value, "Bah!" );
}

struct被允许为非POD语言的原因,例如上面的B,也就是为什么该语言是这样设计的,很可能会在Bjarne的“C++的设计和演变”一书中找到。如果不是,那么很可能只有比昂人自己知道。因为C++的struct的通用性从一开始就一直存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9424255

复制
相关文章
还有比Redis更骚的分布式锁的实现方式吗?有,etcd!
关于为什么要有「分布式锁」这个东西,欢迎阅读我的zk分布式锁的实现,介绍了单机高并发、分布式高并发的解决方案:
行百里er
2020/12/02
2.5K1
还有比Redis更骚的分布式锁的实现方式吗?有,etcd!
数据结构|单例类
要知道什么是单例类,首先就得清楚什么是单例模式。单例模式,是一种简单的常用软件设计模式,在程序运行中有且只有一个实例。既应用该模式的一个类只能有一个对象实类,这种类称为单例类。
算法与编程之美
2019/07/17
4400
卧槽!居然有比Flask更好用更简单的框架
今天它的对手 FastApi 框架来啦!FastAPI是一种现代,高性能的Web框架:
龙哥
2020/09/27
3.9K0
卧槽!居然有比Flask更好用更简单的框架
关于 RabbitMQ,应该没有比这更详细的教程了!
从八月份开始,断断续续连载了不少 RabbitMQ 教程,最近抽空整理了一下,未来可能会有一个视频教程,小伙伴们敬请期待。
江南一点雨
2022/01/24
1K0
关于 RabbitMQ,应该没有比这更详细的教程了!
【NLP】目前有比Topic Model更先进的聚类方式么?比如针对短文本的、加入情感分析的?
作者:霍华德 https://www.zhihu.com/question/298517764/answer/537539141
zenRRan
2019/09/04
1.4K0
大数据可能“说谎” 非结构化数据将呈现更丰富的世界
被忽视的非结构化数据 在过去几年,大数据产业更多关注的是如何处理海量、多源和异构的数据,并从中获得价值,而其中绝大多数都是结构化数据。不可否认,这些数据的体量足够巨大,然而我们今天必须承认这些只是冰山
Spark学习技巧
2019/06/28
1.3K0
大数据可能“说谎” 非结构化数据将呈现更丰富的世界
静态代理和动态代理区别(是否有实现类)
Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,
ha_lydms
2023/08/09
2330
静态代理和动态代理区别(是否有实现类)
Spring AOP,应该不会有比这更详细的介绍了!
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
江南一点雨
2020/09/29
2.7K0
【译】CompletableFuture 是否非阻塞
通过非阻塞和异步编程可以实现这一目标。在 Java 中,_CompletableFuture _类提供了一种编写非阻塞代码的方法。但它真的是非阻塞的吗?
明明如月学长
2023/05/10
7120
【译】CompletableFuture 是否非阻塞
比Python更牛的语言有吗?看我用元类(metaclass)花式创建Python类
为了让更多的人看到本文,请各位读者动动小手,点击右上角【...】,将本文分享到朋友圈,thanks!
蒙娜丽宁
2020/11/04
8080
C++结构体和类的区别_c++有结构体吗
1.结构体是一种值类型,而类是引用类型。值类型用于存储数据的值,引用类型用于存储对实际数据的引用。
全栈程序员站长
2022/11/16
9640
类的单例模式
# new:创建对象自动调用 # new原理:返回值,返回值对象,当前类 -- 条件满足了 init # 实例对象 -- instance class Person(object): cls_shuxing = None # 控制只做一次初始化的开关 -- 开关打开 -- 表示判断 is_First = True def __new__(cls, *args, **kwargs): if cls.cls_shuxing == None:
汪凡
2018/05/29
5980
工业相机 效用几何
企鹅号小编
2017/12/28
8840
工业相机 效用几何
SpringBoot一个依赖搞定session共享,没有比这更简单的方案了!
有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道松哥说的是对的了!
Java团长
2019/06/20
1.1K0
SpringBoot一个依赖搞定session共享,没有比这更简单的方案了!
判断是否有重复的数字
import java.util.Scanner; import java.util.HashMap; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int m=input.nextInt(); HashMap map=new HashMap(); while(m-->0) { int tmp=input.nextInt(); if(
葆宁
2019/04/18
3.4K0
判断是否有重复的数字
SpringBoot 一个依赖搞定 session 共享,没有比这更简单的方案了!
有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道松哥说的是对的了!
好好学java
2020/03/03
1K0
SpringBoot 一个依赖搞定 session 共享,没有比这更简单的方案了!
判断有向图是否有圈
1. 拓扑排序 拓扑排序是对有向无圈图的顶点的一种排序:如果存在一条vi到vj的路径,则vj排在vi后面(因为只要满足这个特性就是拓扑序列,所以它不一定是唯一的)。比如在众多的大学课程中,有些课有先修课,我们可以将其抽象为拓扑排序,有向边(v, w)表明课程v必须安排在w之前,否则课程w就无法进行。我们可以想象所有的课程以及课与课之间的关系可以用一个图来表示,而拓扑排序就可以知道课程安排的顺序。然而,如果图存在圈,就没有拓扑序列。比如如果要上课程A必须上课程B,要上课程B必须上课程C,而要上课程C必须上课程
llhthinker
2018/01/24
2.9K0
Cat6a电缆的屏蔽和非屏蔽结构,到底有啥区别?
Cat6a电缆作为一种高性能以太网电缆,广泛用于数据通信领域。在Cat6a电缆的设计与制造中,屏蔽与非屏蔽是一个关键的技术选择。本文将深入探讨什么是Cat6a?Cat6a电缆的屏蔽和非屏蔽结构、优缺点以及适用领域。
网络技术联盟站
2023/08/29
2.1K0
Cat6a电缆的屏蔽和非屏蔽结构,到底有啥区别?
SpringBoot 一个骚操作搞定 session 共享,没有比这更简单了
有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道我说的是对的了!
好好学java
2019/11/15
2.7K0
SpringBoot 一个骚操作搞定 session 共享,没有比这更简单了
点击加载更多

相似问题

是否有比HTTPS更倾向于协议相关URL的情况?

27

是否有用类实例替换模块的有效用例?

10

是否有将div设计为按钮的有效用例?

11

使用非Equi联接的有效用例是什么?>,>=,<,<=,<>

59

非pod结构的查找表

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文