草庐IT

c++ - C++ 标准是否对没有虚拟成员函数的类类型的大小做出任何保证?

我使用C++进行嵌入式编程。假设我必须实现一个严格定义(即逐字节)的类类型,我可以向它添加一个构造函数和一些其他非虚方法,而该类型的对象不会在字节级别发生变化吗?也就是说,我可以假设不会向其中添加任何其他数据吗?我假设RTTI已关闭。我想确定C++标准是否定义了这一点。 最佳答案 是的,如果您仅添加构造函数和/或非虚拟方法,您将不会更改类的大小或布局,因为原始类和新类的布局将兼容(9.2类成员[class.mem]#17),但仅当它们是标准布局类时。标准布局类定义为:9Classes[class]Astandard-layoutcl

c++ - 从没有默认构造函数的类继承的类

现在我有一个A类继承自B类,而B没有默认构造函数。我正在尝试为A创建一个构造函数,它具有与B的构造函数完全相同的参数structB{intn;B(inti):n(i){}};structA:B{A(inti){//...}};但我得到:error:nomatchingfunctionforcallto‘B::B()’note:candidatesare:B::B(int)我该如何解决这个错误? 最佳答案 构造函数应该是这样的:A(inti):B(i){}冒号后面的位表示“使用其int构造函数初始化该对象的B基类子对象,值为i”。我猜

c++ - 如何为模板类中定义的类定义 friend

假设我有以下定义嵌套类的模板类:templatestructfoo{structbar{};};假设我正在编写代码的环境也有以下帮助程序类,它应该专门用于需要特殊处理的任何类型:templatestructmaybeChangeType{usingtype=T;}/*default:sametype*/我怎样才能专攻maybeChangeType对于foo::bar?专门针对foo::bar很容易,但是foo将与100多种不同的T一起使用所以这不是一个真正的选择。注意:请在将此问题标记为重复之前仔细阅读。这个问题不是询问一般如何专门化(例如Understandingtemplatesi

【Python】matplotlib画散点图,并根据目标列的类别来设置颜色区间(含源代码及参数解释)

最近在进行绘图时,遇到了matplotlib画散点图,并根据目标列的类别来设置颜色区间的问题,但是实现的过程较为艰辛。文章目录一、数据准备二、第一次尝试(失败及其原因)2.1失败2.2原因三、第二次尝试(成功)四、总结—plt.scatter()函数的参数4.1全部常见的参数4.2其中的c参数4.2.1使用单一颜色值4.2.2使用颜色序列4.2.3使用数值映射一、数据准备importpandasaspdimportmatplotlib.pyplotaspltimportnumpyasnpdata=pd.read_excel('./ch2-iris.xlsx')data.head()我们希望画出

c++ - C++ 标准库必须支持对 friend 是谁挑剔的类吗?

这个问题最容易用一个例子来说明,所以这里是:像下面这样的代码是否保证有效,并且可以正确编译和运行?(并不是所有的实现都能正确地编译它,但我想知道这是否是一个错误。)#includeclassPicky{friendPicky*std::copy(Pickyconst*,Pickyconst*,Picky*);Picky&operator=(Pickyconst&){return*this;}public:Picky(){}};intmain(){Pickyconsta;Pickyb;std::copy(&a,&a+1,&b);return0;} 最佳答案

c++ - decltype 和隐藏外部名称的类成员名称之间的交互

这段代码intclash;structFoo{decltype(clash)clash;};在clang上静默编译,但在gcc上编译失败并给出错误error:declarationof'intFoo::clash'[-fpermissive]error:changesmeaningof'clash'from'intclash'[-fpermissive]错误的产生似乎需要2个成分:阴影必须由类成员完成(如果它是函数的局部作用域则没问题)。decltype([shadowedname])必须在声明[shadowingname]之前的阴影范围内使用。我的问题有两个:gcc拒绝此代码是否合理

c++ - 带虚函数的类的大括号初始化

有这段代码:structA{intx;voidf(){}};structB{inty;virtualvoidf(){}};Aa={2};//Bb={3};error:nomatchingconstructorforinitializationof'B'intmain(){return0;}为什么变量a的初始化有效,但变量b的初始化无效? 最佳答案 A是一个集合,因此可以进行大括号初始化,而B不是,因为它有一个虚方法。8.5.1聚合Anaggregateisanarrayoraclass(Clause9)withnouser-prov

c++ - 接受所有版本的 const/volatile 限定和 & vs && 的类模板特化

我专攻std::common_type适合我的类型。我定义了以下专业:common_type一切都很好。然后有人过来调用std::common_type.如果您传递引用与不传递引用(因为它在类型上调用std::decay),则默认版本的行为相同。但是,它并不遵循std::common_type的非引用版本,我需要它才能正常工作。有没有比必须做这样的事情更好的方法(为简单起见,省略对const的右值引用):common_typecommon_typecommon_typecommon_typecommon_typecommon_typecommon_typecommon_typecomm

c++ - 函数参数列表中的类声明

据我所知,在C++中,在函数参数列表中声明的类会自动进入封闭范围:voidf(structA*p){}voidg(){A*p;f(p);}相当于:structA;voidf(A*p){}voidg(){A*p;f(p);}C++标准中的哪一部分规定了这种行为?C呢?嗯,我想在这种情况下C不遵循C++。VisualStudio不编译此代码是C模式:voidg(structA{inta;}a);structAa;//'a'usesundefinedstruct'A' 最佳答案 这是一个精心设计的类型说明符。C++14中的相关引用是:[b

c++ - 如何设计具有 "annotated"字段的类?

假设我们有某种包含数百种消息类型的协议(protocol),我们希望通过C++类对每种消息类型进行建模。由于每个类都应该能够自动处理每个字段,一个自然的解决方案是只使用std::tuple。具有所有必需的类型:std::tuplemessage;print(message);//theusualvariadicmagic这一切都很好。但是,现在我想给每个字段一个名称,并且我希望能够在我的代码中引用该字段时使用该名称,并获得它的文本表示。天真地,或者在C中,我可能会写:structMessage{intheader;doubletemperature;charflag;};这样我们就失去