草庐IT

性行为

全部标签

c++ - 从大 double 静态转换为整数时的奇怪行为

这是我的简单代码:intmain(){doubled1=10000000000.0;constdoubled2=10000000000.0;cout(d1)(d2)(10000000000.0)输出是:-214748364821474836472147483647这让我大吃一惊。为什么正double有时会转换为负整数?我正在使用g++:GCC版本4.4.3(Ubuntu4.4.3-4ubuntu5)。 最佳答案 当int不足以容纳值时,将double转换为int会产生未定义的行为.[n3290:4.9/1]:Aprvalueofaf

c++ - 是否有任何 C++ 工具可以检查常见的未指定行为?

人们通常会对正在编写代码的特定平台做出假设,例如,有符号整数使用二进制补码存储,或者(0xFFFFFFFF==-1),或类似性质的东西。是否存在一种工具可以检查代码库是否存在此类最常见的违规行为(对于我们这些想要可移植代码但没有奇怪的非二进制补码机器的人)?(我上面的示例特定于有符号整数,但我也对其他错误(例如对齐或字节顺序)感兴趣) 最佳答案 您可能希望打开各种级别的编译器警告,您可以将警告视为错误。如果您知道您在代码的不同位置做出了其他假设,您可以断言它们。如果您可以使用静态断言来做到这一点,您将在编译时失败。

c++ - 为什么在 STL 中允许未定义的行为?

默认情况下,std::stack的“底层容器”是std::deque。因此,对于std::deque而言,任何未定义的行为对于std::stack而言都是未定义的行为。cppreference和其他站点在描述成员函数的行为时使用术语“有效地”。我认为这意味着它适用于所有意图和目的。因此,调用top()和pop()等同于调用back()和pop_back(),并在空容器上调用这些是未定义的行为。根据我的理解,它是未定义行为的原因是为了保留不抛出保证。我的理由是std::vector的operator[]具有不抛出保证,如果容器大小大于N,则为未定义行为,但at()有很强的保证,如果n超出

c++ - 为什么覆盖全局新运算符和类特定运算符不是模棱两可的行为?

考虑以下代码:classFoo{public://class-specificFoooperator+(Foo&rhs){returnFoo();//Justreturnatemporary}void*operatornew(size_tsd){returnmalloc(sd);}};//globalFoooperator+(Foo&lhs,Foo&rhs){returnFoo();}void*operatornew(size_tsd){returnmalloc(sd);}此代码无法编译,声明调用不明确,因为它匹配两个运算符:Fooa,b;a+b;但是这个带有new运算符的编译得很好,

c++ - 为什么不完整类型的智能指针数据成员和原始指针数据成员在其父级析构时具有不同的行为?

在下面的代码中:智能指针数据成员pImpl(classImpl)和原始指针pc(classCAT)都是不完整的数据类型,Widget.h中没有这两个类的定义//控件.h#ifndefW_H_#defineW_H_#includeclassWidget{public:Widget();~Widget(){//deletepc;//IknowIshouldput~Widgetto.cpp//Ijustwanttoshowthedifferenceinbehavior//betweenrawpointerandsmartpointer(bothhasincompletetype)//when

c++ - 使用 'auto' 和 std::minmax 观察奇怪的行为

我在SUSEEnterpriseLinux11上使用GCC4.7.2和Boost1.58.0。我有以下代码片段,它基本上通过多边形列表来计算它们的长度/宽度。在std::minmax函数中使用“auto”关键字时,我看到了奇怪的输出。为了进行比较,我还声明了第二个变量,其中明确声明了类型(即dim与dim1)。namespacegtl=boost::polygon;typedefgtl::polygon_90_dataLayoutPolygon;typedefgtl::rectangle_dataLayoutRectangle;staticLayoutFeatureVeccalc_st

c++ - 在初始化列表中引用类成员是未定义的行为吗?

假设我有以下内容:classA{Bmember1;Cmember2;public:A();};classB{public:C&ref_to_c;B(C&ref_to_c);};classC{...};B要求在其构造函数中提供对C的引用。如果A类提供C,那么指定A的初始化列表如下是否合法...A():member1(B(member2)){}也就是说,member2是否存在于initialiserlist阶段,还是这个undefinedbehavior? 最佳答案 初始化如下:5Initializationshallproceedin

c++ - 如果使用优化 (-O2, -O3),为什么这段代码的行为会有所不同?

我不得不编写一些检查例程,如果使用-O0、-O1、-O2或-O3,它们的行为似乎会有所不同。下面我创建了一个适用于-O0和-O1的最小示例。但是使用-O2或-O3行为发生了变化。在-O0和-O1的情况下,for循环递增整数,并且第一次达到最大值时,会发生溢出并触发检查例程。在另一种情况下,for循环永远不会中断,尽管整数变为负数。代码#includeinlineboolcheck(constinti){if(i为什么允许编译器优化它?尝试使用gcc、clang和icc,只有icc在所有优化变体中都正确,其他两个没有。 最佳答案 Si

c++ - 为什么 std::accumulate 对于标准数组会有这样的行为?

我刚接触C++,我想我已经掌握了指针,但是std::accumulate()让我感到困惑。给定数组:inta[3]={5,6,7};我想用std::accumulate()对数组的值求和,所以我向它传递了一个指向第一个元素的指针,然后是最后一个元素,然后是蓄能器。std::accumulate(a,a+2,0);std::accumulate(&a[0],&a[2],0);糟糕:其中任何一个只返回前两个元素的总和:11。另一方面,如果第二个参数是一个无意义的指针,就超出了范围......std::accumulate(a,a+3,0);std::accumulate(&a[0],&a[

c++ - std::atomic<uint_least8_t> 行为

在一个系统上:typedefunsignedcharuint8_t;typedefunsignedshortuint16_t;std::atomic::is_always_lock_free//=>falsestd::atomic::is_always_lock_free//=>true据我了解,类型std::atomic将是8位并且不是无锁的。如果是这样,如果我想要一个至少8位且始终无锁的原子类型,我应该怎么写?(假设存在这种类型)是否有比以下更好的选择:std::atomic::is_always_lock_free,uint8_t,uint16_t>::type>(为简单起见,我