草庐IT

行为树

全部标签

c++ - arm cortex a9 交叉编译奇怪的浮点行为

我正在尝试将一个更大的应用程序从x86移植到armcortexa9,但是当交叉编译应用程序时,我遇到了像modf这样的浮点函数的奇怪段错误,其他libc++函数似乎只是错误地处理float,但是不要不会崩溃(见下文)。所以我尝试了这个小测试程序,它也可以触发错误。测试程序的输出(见下文)应该可以证明我的问题。#includeintmain(intargc,char*argv[]){doublex=80;doubley=0;std::cout在armcortexa9上编译:@tegra$g++-Walltest.cpp-otest_nativ@tegra$./test_nativ800交

c++ - reinterpret_cast/static_cast 和未定义的行为

在一个变体类中,我正在处理原始存储是一个字符数组:alignas(/*thestrictestalignmentofalltypesofthevariant*/)charstorage[/*...*/];赋值运算符是这样的:templatevoidoperator=(constX&x){//...codeforclearingthestorageandsettingthetagfortypeX...new(storage)X(x);}而获取存储对象的代码是:templateconstX&get(){//...return*reinterpret_cast(storage);//...}

c++ - 在溢出的情况下,i++ 是否会为小于 int 的有符号类型调用未定义的行为?

很明显,由于算术溢出,以下代码调用了未定义的行为:#includeinttest(void){inti=INT_MAX;i++;/*undefinedbehavior*/returni;}但是小于int的签名类型呢?例如short或signedchar?(更小的,我分别假设SCHAR_MAX和SHRT_MAX)。下面哪个函数会调用未定义的行为,为什么?signedchartest2(void){signedchari=SCHAR_MAX;i=i+1;/*implementationdefined*/returni;}signedchartest3(void){signedchari=S

c++ - 不完整类型的调用运算符的 decltype 的特殊行为

我一直在努力解决编译问题,并且能够将问题缩小到一个小代码段。为了做好准备,我正在尝试执行CRTP,其中基方法调用派生类中的另一个方法。复杂的是,我想使用尾随返回类型来直接获取转发到派生类方法的类型。这总是无法编译除非我转发给派生类中的调用运算符。编译:#includestructIncomplete;templatestructBase{templateautoentry(Args&&...args)->decltype(std::declval()(std::declval()...));};voidexample(){Basederived;}虽然这不是:(注意唯一区别的注释)#i

c++ - 移动构造函数行为

我最近偶然发现了移动构造函数的一些奇怪行为(从我的角度来看很奇怪)。使用GCC和VisualStudio编译时结果不同。我想听听对此行为的解释,不要认为这是一个错误,但可能是特定于编译器的。考虑以下代码:#include#includestructTest{std::unordered_mapv;std::unordered_map::iteratorvend;Test(std::unordered_map::iterator&it):vend{v.end()}{it=this->vend;};Test()=delete;Test(Testconst&)=delete;Test(Tes

c++ - MSVC 与 GCC 与 sizeof 的行为不一致

考虑以下代码:#includeclassA{public:structB{intM;};staticvoidStaticFunc();};voidA::StaticFunc(){conststd::size_ts0=sizeof(::A::B::M);conststd::size_ts1=sizeof(A::B::M);conststd::size_ts2=sizeof(B::M);}intmain(){conststd::size_ts3=sizeof(A::B::M);return0;}GCCcompilesit,只是警告未使用的变量。但是VisualC++2015无法编译它:er

c++ - 通过在此指针上放置 new 重新初始化对象的未定义行为

我看到了关于PiotrPadlewski的cppcon的介绍。说以下是未定义的行为:inttest(Base*a){intsum=0;sum+=a->foo();sum+=a->foo();returnsum;}intBase::foo(){new(this)Derived;return1;}注意:假设sizeof(Base)==sizeof(Derived)和foo是虚拟的。显然这很糟糕,但我很想知道为什么它是UB。我确实了解UB访问realloced指针,但他说,这是一样的。相关问题:Is`new(this)MyClass();`undefinedbehaviourafterdir

c++ - 使用显式命名空间限定符时,模板实例化行为会发生变化吗?

我一直在试验一个可组合管道系统,它涉及一组“阶段”,这些阶段可能是模板化的。每个阶段处理自己的设置、执行和清理,模板推导用于构建管道使用的“状态”的最小列表。这需要相当多的样板模板代码,这些代码显示出一些明显不协调的行为。尽管实验成功,但实际上将其滚动到我们的代码库中会由于实例化无效而导致错误。我们花了一些时间来找出玩具(工作)解决方案和更丰富的版本之间的差异,但最终缩小到明确的命名空间规范。templatestructbind_stage{static_assert(!std::is_same::value,"Nope,someonedefaultinstantiatedme");}

c++ - __has_trivial_copy 在 clang 和 gcc 中的行为不同。谁是对的?

std::is_trivially_copyable在这两个编译器中仍然不被支持(至少gcc4.6是这样)。但是两者都提供了做得很好的__has_trivial_copy指令。除非涉及到已删除的复制构造函数。structA{A(Aconst&)=delete;};__has_trivial_copy(A)在clang中返回1,在gcc中返回0。我正在研究标准,但找不到说明删除复制构造函数时类是否仍被视为可平凡复制的条款。谁是对的?我倾向于相信gcc是正确的,因为structA根本不可复制,更不用说可复制了。此外,有一个广泛的共识,即删除的复制构造函数可以被视为私有(private)声明

具有私有(private)复制构造函数的 C++11 std::is_convertible 行为

我正在努力理解std::is_convertible在C++11中。根据cppreference.com,std::is_convertible::value当且仅当“如果类型为T的虚数右值可用于返回U的函数的返回语句中”,则应计算为1。不过,措辞并未说明该函数可能在何处声明。当U的复制构造函数时,人们应该期待什么?是私有(private)的?当T时应该期待什么是左值引用吗?例如,考虑这段代码:#include#includestructFact_A;structA{friendstructFact_A;A()=default;A(A&&)=delete;private:A(const