草庐IT

c++ - abs 的溢出是否定义明确?

以下代码的行为是否定义明确?int32_ti=-0x80000000;uint32_tu=abs(i);第一行可能有上溢/下溢。但是在可以的平台上,第二行是否有定义的行为? 最佳答案 你是说-0x80000000有七个0吗?abs(-0x8000000)的行为肯定是明确定义的(uint32_t和int32_t都包含±0x8000000它们的有效范围如果这些类型存在。当标准说一种行为未定义时,即使某些特定平台以某种已定义的方式工作,它也是未定义的。C++的abs函数取自C,C标准说(§7.20.6.1/2):Theabs,labs,a

c++ - 明确定义的移位超过 32 位,没有编译器警告

这是一个愚蠢的问题,部分原因是为了好玩。我有一个“明确定义”(或“饱和”?)位掩码函数templateuint32_tmask(uint32_tx){constuint32_tMASK=N>=32?~uint32_t(0):(uint32_t(1)预期行为:uint32_tx=~uint32_t(0);//0xFFFFFFFFmask(x)=>0x000000FFmask(x)=>0x00FFFFFFmask(x)=>0xFFFFFFFFmask(x)=>0xFFFFFFFF但我不喜欢有一个未定义的代码uint32_t(1)在mask()内尽管它100%无害(不应对其进行评估。)我不想

STD :: MAP默认构造函数是否明确?

以下代码在G++(各种版本)上填充了罚款,但在Clang++-3.4上失败了我的系统上的libc++:#include#includestd::mapf(){return{};}intmain(){autom=f();}clang标记以下问题:x.cpp:6:12:error:chosenconstructorisexplicitincopy-initializationreturn{};^~/usr/local/Cellar/llvm34/3.4.2/lib/llvm-3.4/bin/../include/c++/v1/map:838:14:note:constructordeclaredh

c++ - 保存对象的析构函数地址并在以后调用它是否定义明确的行为?

我目前正在研究用C++编写的堆栈分配器。应该可以通过模板方法从此堆栈分配器获取对象。一旦调用另一个释放方法,这些对象就应该被销毁。在尝试使用不同的方法来实现析构函数的调用时,我偶然发现了以下内容:autodestructor=someObject->~SomeClass;destructor();析构函数似乎是被实际调用的,但这对我来说有点奇怪。我有以下问题:这是明确定义的行为吗?析构函数的类型是什么(我可以用什么替换auto关键字)?我能否将多个不同类型对象的所有析构函数地址保存在一个列表中,并在以后调用它们? 最佳答案 如评论所

c++ - 在定义明确的 C++ 中,从引用中获取的指针是否可以为空?

这个问题的动机是clang和gcc对检查指针值与nullptr的不平衡处理。对于this,它们都发出警告,但对于通过在对象上使用address-of运算符获取的指针,它们保持安静。我很确定这样的指针应该始终有效,因为我们遇到过错误,因为现代编译器从快乐的90年代实际触发的地方删除了对c++代码的此类检查。令我困惑的是为什么编译器在一般情况下保持安静。if是否有可能以某种方式触发,或者这只是两个主要编译器的设计决定?在我开始编写补丁或窃听编译器开发人员之前,我想以确保我没有遗漏任何东西。Toyexample:#includeclassA{voidf(){if(!this){std::co

c++ - 此代码行为是否定义明确?

这是一些C++代码:#includeclassA{intx;inty;doublev;public:A(intx,inty):x(x),y(y){std::cerr我得到以下输出:A(3,5)f(9.5)~A()即因为我希望它工作。但我不确定A的析构函数是否必须在f返回后调用。有保障吗?operatordouble*()返回的指针是否会在f的调用中变得无效? 最佳答案 您将A对象声明为f的实际参数,当您这样做时,对于所有效果而言,新对象就像f的局部变量,因此保证在f执行结束时调用~A。如果f返回由operatordouble*()返

c++ - 不能明确特化

我收到这个错误:SeverityCodeDescriptionProjectFileLineSuppressionStateErrorC2910'addingStuff::addingStuffFunc':cannotbeexplicitlyspecializedBuckysTemplateSpecializationc:\users\amanuel\documents\visualstudio2015\projects\buckystemplatespecialization\buckystemplatespecializ当我尝试运行这段代码时:#include#includetem

c++ - 我应该明确地零初始化 auto_ptr 吗?

我的一些同事更喜欢在构造函数初始化列表中将std::auto_ptr显式初始化为0,但它会被初始化为0在它的构造函数中没有任何显式初始化。那么有什么理由这样做吗?#includeclassA{A():SomePtr(0){}private:std::auto_ptrSomePtr;}; 最佳答案 不,std::auto_ptr的默认构造函数正是这样做的,因此没有必要显式地这样做。无论如何,这是风格问题,您应该保持一致。例如,您是否会在构造函数初始化列表中显式调用成员vector的默认构造函数?作为旁注,std::auto_ptr在即

c++: string::find 对于空输入字符串的行为是否定义明确

以下代码片段在我的编译器(visualstudio)上始终返回true。但这种行为是否定义明确且可移植?boolreturn_always_true(std::stringconst&str){returnstr.find("")!=std::string::npos;}intmain(){cout 最佳答案 我找到了cppreference.com比标准更容易阅读。引用他们:Findsthefirstsubstringequaltostr...Formally,asubstringstrissaidtobefoundatposit

c++ - 在 Harmattan 上制作 QWidget 应用程序肖像的明确指南

在MeeGoHarmattan设备上如何制作QWidget应用程序肖像是否有明确的指导?我目前正在使用N950(N9的开发版),我的应用一直处于横向模式。应用程序以前是用QMainWindow编写的QApplication 最佳答案 根据thisNokiadocumentation,QWidget在Harmattan上不受支持。我认为存在一些向后兼容性,但如果您继续使用QWidget,您将无法完全集成到平台中。Thisblogpost还提供了一些有关将Qt应用程序移植到Harmattan的指南。如果您将应用程序转换为QML,您将能够