草庐IT

行为树

全部标签

c++ - 在链接规范(extern "C",extern "C++")中,在 C++ 代码中包含标准 C header 的指定行为是什么?

通常在全局命名空间中包含C++中的标准库header,在任何extern之外s,像这样:#includeintmain(){}但是,如果您在其中包含一个标准库头文件,会发生什么情况呢?例如:extern"C"{#include}intmain(){}或extern"C++"{#include}intmain(){}它是否指定了在这两种情况下应该发生什么,或者它是实现定义的还是未定义的?C++1117.6.2.3p1说C++标准库头文件把东西放在extern"C++"中,但我的初步解读是这不适用于这样的C头文件.C++1117.6.2.2p3表示header只能是#included在任何

c++ - 显式调用析构函数的行为

some_class的定义是:classsome_class{//stuffpublic:~some_class(){deletedynamic_three;}private:classAone;classBtwo;classC*dynamic_three;}当一个对象的生命周期结束时,它的销毁是:(1)调用它的析构函数和(2)按照它们在类定义中声明的顺序(=内存中的位置)销毁它的子对象。但是,如果我有类似的东西:auto*ptr=newsome_class();//morestuffptr->~some_class();//l.X第(2)步也实现了?我的意思是,在X行中,子对象的析构

c++ - 模板特化 - MSVC 和 GCC/MinGW 之间的不同行为

我特化了一个模板,并在MSVC编译器和MinGW/GCC之间遇到了不同的行为。这是头文件://MyClass.h#ifndefMYCLASS_HEADER#defineMYCLASS_HEADERtemplateclassMyClass{public:virtualvoiddoSomething(){//somecode}};//specializationprototypehere#endif现在,区别。为了避免多次定义,我只在头文件中特化了一个原型(prototype),实现在一个cpp文件中。特化是个问题。GCC/MinGW编译器只接受这个:templatevoidMyClass

Java 赋值运算符行为与 C++

这是在我处理“破解编码面试”问题时发生的:Writeafunctiontoswapanumberinplace(thatis,withouttemporaryvariables)我决定用Java编写我的解决方案(因为我计划在实习面试中使用Java。)我提出了一个我几乎确信是正确答案的解决方案(因为我是在一行中完成的):publicstaticvoidmain(Stringargs[]){inta=5;intb=7;a=b-a+(b=a);System.out.println("a:"+a+"b:"+b);}果然,这段代码执行了预期的结果。a==7和b==5。现在是有趣的部分。此代码不会

c++ - 模板化 ID 生成器定义明确的行为?

我想避免为所有需要Id的类分配Id,因此我编写了一个小型模板化ID生成器。BaseIdGenerator::makeUniqueId只是返回一个新的Id,每次它被调用时:classBaseIdGenerator{protected:staticinlineIdmakeUniqueId(){staticIdnextId=0;returnnextId++;}};要将Id分配给各个类,只需将该类作为模板参数传递给IdGenerator:templateIdgetId();templateclassIdGeneratorfinal:publicBaseIdGenerator{staticIdi

c++ - 这个有界递归的程序是否有未定义的行为?

我知道无限递归或迭代是未定义的行为,但有界不是。但是,这个程序段对于大多数输入都是错误的。它是否有未定义的行为,为什么或为什么不?如果它有未定义的行为,我是否可以进行一些修改以消除未定义的行为?#includeusingbigint=::std::uint64_t;constexprconstbigintadd_val=1442695040888963407;constexprconstbigintmult_val=6364136223846793005;bigintcompute(bigintt){if(t>1){returnadd_val+compute(t*mult_val);}

c++ - const vs #define(奇怪的行为)

我曾经用#define替换const,但在下面的示例中它打印了false。#include#definex3e+38usingnamespacestd;intmain(){floatp=x;if(p==x)cout但是如果我替换#definex3e+38与constfloatx=3e+38;它完美运行,问题是为什么?(我知道有几个主题讨论#definevsconst,但真的没明白,请赐教) 最佳答案 在C++中,文字是double的。在第一个示例中,数字3e+38首先在变量初始化中转换为float,然后在比较中返回double。转换

c++ - std::sort - 是否传递了错误的比较器未定义行为?

考虑这段代码:std::sort(vec.begin(),vec.end(),[](constFoo&lhs,constFoo&rhs){return!(lhs如果lhs==rhs,lambda(lhs,rhs)和lambda(rhs,lhs)都将返回true,这违反了提供严格弱排序的要求。但是,标准是否明确将传递此类比较器标记为未定义行为? 最佳答案 警告:接下来是极端的语言律师。themostrecentdraftofthestandard的措辞在[alg.sorting]p3中是这样写的:Forallalgorithmstha

c++ - 如何制作具有派生行为的模板?

我有一个模板Conditional,它根据bool表达式返回value:templatestructConditional{};templatestructConditional{typedefC1value;};templatestructConditional{typedefC2value;};,Int>::value;//Int,Int>::value,//Int我想制作一个ConditionalInteger模板,他的行为源自ConditionConditionalInteger::value==0;//trueConditionalInteger::value==1//fal

c++ - 如何在 C++ 构造函数中获得多态行为?

我有一个基类,我希望它看起来像这样:classB{//shouldlooklike:intI(){returnsomeConst;}virtualintI()=0;publicB(){something(I());}}重点是强制派生类重写I并强制在构造每个对象时调用它。这用于做一些簿记,我需要知道正在构造什么类型的对象(但我将当前对象视为基类)。这行不通,因为C++不允许您从构造函数调用抽象虚函数。有没有办法达到同样的效果?基于thislink答案似乎是没有办法得到我想要的。然而它说的是:Theshortansweris:no.Abaseclassdoesn'tknowanything