草庐IT

c++ - gcc:通过显式 memcpy 避免严格别名违规警告

我有一个占用64位内存的类。为了实现平等,我使用了reinterpret_cast,但它会在gcc7.2(但不是clang5.0)上导致此警告:$g++-O3-Wall-std=c++17-g-cexample.cppexample.cpp:Inmemberfunction‘boolX::eq_via_cast(X)’:example.cpp:27:85:warning:dereferencingtype-punnedpointerwillbreakstrict-aliasingrules[-Wstrict-aliasing]return*reinterpret_cast(this)=

C++:如何检查所有单参数构造函数是否都是显式的

是否有一个程序可以扫描整个项目并报告所有符合隐式转换条件的构造函数?谢谢! 最佳答案 Cppcheck也许能够做到这一点,但我不确定。如果现在不这样做,它将是构建此类功能的理想框架。(此外,如果您还没有使用Cppcheck,请立即开始!免责声明:我是贡献者。) 关于C++:如何检查所有单参数构造函数是否都是显式的,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/5736022/

c++ - 带有显式右值转换运算符的 static_cast

我正在编写一个简单的包装类,我想为包装类型提供显式转换运算符。以下代码使用gcc编译良好classwrap{doublevalue;public:explicitwrap(doublex):value(x){}explicitoperatordouble&&()&&{returnstd::move(value);}};intmain(){wrapw(5);double&&x(std::move(w));//okdouble&&y=static_cast(std::move(w));//clangreportsanerrorhere}但是clang报告error:cannotcastfr

c++ - 在定义之前显式实例化模板函数

如果先声明,是否允许在定义函数之前显式实例化模板函数?例如,是否允许以下​​内容://declarationtemplatevoidfoo(Tparam);//explicitinstantiationtemplatevoidfoo(int);//definitionofprimarytemplatetemplatevoidfoo(Tparam){}总的来说它似乎可以编译,但当然这只是一个关于是否允许的轻微指示。 最佳答案 在[temp.explicit]中没有明确禁止它.此外,还有一个明确的声明([temp.explicit#5]

c++ - 静态成员显式定义

考虑这段代码:#includeusingnamespacestd;classWilma{public:staticinti;Wilma(){cout此处A行显式定义了Wilma类的staticinta。(注释掉导致链接器错误)没有它,链接器会给出undefinedreference错误。(因为实际上正在使用Wilma::i,如果我不使用它,则不会出现链接器错误。)对于Fred类的静态Wilmawilma_应该也是如此,即它也应该被显式定义......因为它也在B行的代码中使用。但事实并非如此,如果Fred::wilma_未明确定义,则不会出现链接器错误。为什么?在gcc4.5.2上测试

c++ - 函数模板显式特化 C++

我的书提到了两种显式特化的方法:templatevoidSwap(int&,int&);templatevoidSwap(int&,int&);两者有什么区别?什么时候用一个,什么时候用另一个?函数名后面的到底是什么? 最佳答案 whatisthedifferencebetweenboth?没有区别。在第二种情况下,您让编译器从特化的签名中执行类型推导。因此,两种形式都声明了Swap()的特化。对于T=int.whentouseoneandwhentousetheother?由您自行决定,当一种形式或另一种形式满足您在可读性或易于维

c++ - NvAPI NVAPI_INTERFACE 缺少显式类型

我是c++/cli的新手,想为nvapi编写一个小的托管包装器。现在尝试访问某些函数时(例如NvAPI_Initialize)VisualStudio告诉我这个函数没有定义:#include"nvapi.h";NvAPIStatusNv_GPU_ThermalAPI::M_NvAPI_GPU_GetThermalSettings(System::UIntPtrgpuHandle,Nv_Thermal_TargetsensorIndex,[Out]array^%settings){NvAPI_Statusres=NvAPI_Status::NVAPI_OK;//OKNvPhysicalG

没有显式指针的 C++ 多态调用

如果我有基类:structBase{voidfoo(){bar();}virtualvoidbar(){}};和派生类:structDerived:publicBase{voidbar(){cerr写这段代码的时候会发生:Derivedd;d.foo();我将看到打印“Derivedhere”——因为调用了Derived::bar。但是我没有通过指向基的指针调用,而是在这里工作的多态性。为什么?是不是因为Base::foo中对bar的调用实际上隐式调用了this->bar()和bar在类的vtable中查找? 最佳答案 您的猜测完全

c++ - 为什么不调用虚拟基础非默认构造函数,除非大多数派生基础显式调用它们?

我想了解为什么C++标准要求虚拟基础非默认构造函数不能由非最派生的中间体调用类,如此代码中所示,当使用“-D_WITH_BUG_”编译时:/*Avirtualbase'snon-defaultconstructorisNOTcalledUNLESS*theMOSTDERIVEDclassexplicitlyinvokesit*/#include#include#includeclassA{public:int_a;A():_a(1){std::cerr因此,当编译时没有-D_WITH_BUG_,代码打印:$g++-I.-std=gnu++17-mtune=native-g3-fPIC-

c++ - 具有显式模板实例化的未解析外部。什么是声明语法?

这里有一些简化的代码来演示我遇到的问题。我有一个模板函数,我只想为其编译某些固定的实例。函数声明是://***template.h***intsquare(intx);doublesquare(doublex);定义是://***template.cpp***#include"template.h"//(templatedefinitionunusuallyinacoderatherthanheaderfile)templateTsquare(Tx){returnx*x;}//explicitinstantiationstemplateintsquare(intx);templatef