草庐IT

c++ - 仅允许从引用到长期值(value)的隐式构造

我已经实现了一个类型删除引用类,它可以从对任何类型的左值引用构造。但是,关于是否允许从r值构造,我遇到了一些进退两难的问题。我遇到过两个用例:将引用构造为局部变量inti=42;Referenceref1=i;//Thisisallowed.Referenceref2=42;//Thisshouldcauseacompileerror.将引用构造为函数参数voidfunc(Referenceref);inti=42;func(i);//Thisisallowed.func(42);//Thisshouldalsobeallowed.实际上,我想允许从任何生命周期大于引用的东西隐式构造一

c++ - 允许对单个值进行隐式转换

我有一个Flags类,它的行为类似于std::bitset,它正在替换旧代码库中的位打包整数。为了强制遵守较新的类,我想禁止从int类型进行隐式转换。enumclassFlag:unsignedint{none=0,A=1,B=2,C=4,//...};classFlags{public:Flags();Flags(constFlag&f);explicitFlags(unsignedint);//don'tallowimplicitFlags(constFlags&);private:unsignedintvalue;};我想只允许来自Flag和Flags类型的隐式构造和赋值。但是,

c++对模板类的用户定义运算符的隐式转换

我有一个结构模板A和一个+运算符int.#includetemplatestructA{inta;};templateintoperator+(Aa,intb){returna.a+b;}我创建了一个结构模板B,可转换为A.templatestructB{intb=3;operatorA(){return{b+10};}};现在我要B转换为A打电话时B+int.intmain(){std::cout{9}+10){9}+10)我读了Implicitconversionwhenoverloadingoperatorsfortemplateclasses并写道templatestructB

具有隐式参数的 C++ 函数模板实例化

我不明白为什么下面的代码可以正常编译:#includevoidbar(intx){std::cout//NotetheorderofAandB.voidfoo(Bx){bar((A)x);}intmain(){intx=1;doubley=2;foo(x);//CompilesOK.foo(y);//CompilesOK.return0;}但是如果我如下调换A和B的顺序,那么它不会编译:#includevoidbar(intx){std::cout//OrderofAandBareswitched.voidfoo(Bx){bar((A)x);}intmain(){intx=1;doub

c++ - boost 侵入式指针

我对boost的侵入式指针有点困惑。定义说:"Everynewintrusive_ptrinstanceincrementsthereferencecountbyusinganunqualifiedcalltothefunctionintrusive_ptr_add_ref,passingitthepointerasanargument.Similarly,whenanintrusive_ptrisdestroyed,itcallsintrusive_ptr_release;thisfunctionisresponsiblefordestroyingtheobjectwhenitsre

c++ - 是否可以在 C++17 的 GCC 中使用显式寄存器变量?

我正在使用explicitregistervariables使用没有machine-specificconstraints的寄存器将参数传递给原始Linux系统调用(例如x86_64上的r8、r9、r10)按照建议here.#include#ifdef__i386__#define_syscallOper"int$0x80"#define_syscallNumReg"eax"#define_syscallRetReg"eax"#define_syscallReg1"ebx"#define_syscallReg2"ecx"#define_syscallReg3"edx"#define_s

c++ - 从模板基类派生的类的隐式转换

我在隐式转换、模板和模板类继承方面遇到了问题。以下是我从我的项目中提取的内容,我省略了一些类甚至是抽象的,但这与大小写无关。classA{};classB:publicA{};templateclassBase{};classDerived:publicBase{};intmain(){Derivedd;Base*base=newDerived();}基本上,我有一个模板基类Base我得出Derived:publicBase从。然后我必须将它转换为最常见的Base形式,即Base.我原以为我可以转换一个派生自Base的对象至Base隐含地,作为B源自A.我做错了什么或者我怎么能隐式?这

c++ - 隐式转换为模板

我下面的示例表明,从非模板类型到模板类型的隐式转换不会像仅涉及非模板类型的那些那样无缝地工作。有没有办法让它们继续工作?例子:structpoint;templatestructvec{vec(){}//...};templatestructvec{vec(){}vec(constpoint&p){/*...*/}//Conversionconstructor//...};structpoint{operatorvec(){returnvec(/*...*/);}//Conversionoperator};templatevecfoo(veca,vecb){returnvec(/*..

c++ - 所有公共(public)结构产生对隐式删除的默认构造函数的调用

我明白调用隐式删除的默认构造函数是什么意思,但我不明白为什么我会在这里得到它:structTransformData{enumtype_t{kDelay=0,kScale,kTranslate,kRotation}type;uniondata_t{doubledelaySeconds;floatscale;floatrotation;vec3translate;}data;};然后我有:TransformData数据;//生成标题中指出的错误POD不应该有编译器提供的简单默认构造函数吗? 最佳答案 如前所述,Vector3是非POD

c++ - 为什么必须显式加入线程?

所以这看起来很简单:#include#includevoidsecond(){cout如果我不包含join(),那么系统会调用abort()。我不明白这个,线程不应该自己退出吗?必须加入线程似乎会使代码更难正确封装。这是怎么回事? 最佳答案 那是C++线程库设计的一部分。您不需要加入线程,您也可以分离它。但我不建议您默认使用detach线程,因为这会带来一系列复杂问题。与您所说的相反,我认为这根本不会使代码更难封装。有不同的抽象级别,选择线程级别意味着您需要意识到存在线程并且需要处理它们。对于不同的事物你可以选择不同层次的抽象,例如