草庐IT

c++ - 为什么可以从外部通过指针或引用访问静态本地对象?

您可能知道,局部静态变量不能通过名称在函数外部访问,但可以通过指针或引用访问。所以下面的代码是格式良好的。但是为什么?我知道这个事实是事实,但没有根据。其实我想要的是C++标准的相关摘录。我正在阅读它,但最终没有找到证据。谁能给我摘录或提示以找到它(因为仅在文档中搜索“静态”会导致超过一百次点击)?#includeusingnamespacestd;classTest{public:int*f(inti)const{staticintj;j+=i;cout"nowj=3"*p+=10;t.f(0);//=>"nowj=13"int&r=t.g(3);//=>"nowk=3"r+=10;

c++ - 由于 LARGEADDRESSAWARE 检测指针算术

我想将我的应用程序切换到LARGEADDRESSAWARE。需要注意的问题之一是指针运算,因为指针差异不能再表示为带符号的32b。有什么方法可以在大型C++项目中自动查找指针减法的所有实例吗?如果没有,是否有一些“最省力”的手动或半自动方法如何实现? 最佳答案 PC-Lint可以发现这类问题。看http://gimpel-online.com/MsgRef.html,错误代码947:Subtractoperatorappliedtopointers--Anexpressionoftheformp-qwasfoundwhereboth

c++ - 智能指针删除器和名称为 "using"的 "pointer"关键字

前段时间看到这样一段代码:void*Create(){int*t{newint{10}};returnt;}classDeleter{//uncommentinordertocompile//usingpointer=void*;public:voidoperator()(void*t){deletet;}};unique_ptrptr{Create()};它不编译。对于VS2013,它说:error:C2440:'initializing':cannotconvertfrom'initializer-list'to'std::unique_ptr'Noconstructorcould

c++ - if(double) 有效的 C++ 吗?

我刚遇到这行代码:if(lineDirection.length2()){...}其中length2返回一个double。让我有点困惑的是0.0等同于0、NULL和/或false。这是C++标准的一部分还是未定义的行为? 最佳答案 这是一个非常标准的行为(bool转换)$4.12/1-"Anrvalueofarithmetic,enumeration,pointer,orpointertomembertypecanbeconvertedtoanrvalueoftypebool.Azerovalue,nullpointervalue,

c++ - "function"类型的优点是什么(不是 "pointer to function")

阅读C++标准,我看到有“函数”类型和“函数指针”类型:typedefintfunc(int);//functiontypedefint(*pfunc)(int);//pointertofunctiontypedeffunc*pfunc;//sameasabove我从未见过在示例之外使用的函数类型(或者我可能没有意识到它们的用法?)。一些例子:funcincrease,decrease;//declarestwofunctionsintincrease(int),decrease(int);//sameasaboveintincrease(intx){returnx+1;}//cann

c++ - 在 C++ 中将指针变量分配给 const int?

我想知道是否有人可以向我解释以下内容:如果我写inti=0;float*pf=i;我得到一个编译错误(gcc4.2.1):error:invalidconversionfrom‘int’to‘float*’有道理——它们显然是两种完全不同的类型。但是如果我写constinti=0;float*pf=i;它编译没有错误。为什么“const”应该在赋值的右侧有所不同?“const”关键字的想法不是能够对常量值强制类型约束吗?我能想到的任何解释都感觉像是假的。而且我的解释都没有解释这个事实constinti=1;float*pf=i;编译失败。谁能解释一下? 最佳

c++ - 指针类型环绕它们的最大值吗?

考虑一个不是nullptr的指针char*p,以及循环while(++p);行为是明确定义的还是未定义的?换句话说,当达到最大可分配内存(可能是2^32或2^64)时,指针最终会变为0还是这只是UB?std::numeric_limits是(如预期的那样)不专门用于指针类型。 最佳答案 简短回答:根据规范,这是未定义的行为。执行任何导致未分配内存超过已分配项目一个地址的指针算法(请参阅GCC文档中的OnePasttheEnd章节以了解其重要性)是未定义的行为。要了解原因,让我们看看标准:C++11标准中的第3.7.4.3.2节枚举了

c++ - 返回需要由智能指针持有的 'pointer'

我有一个项目,我想更多地使用智能指针。总的来说,我已经成功地实现了这个目标。但是,我遇到了一件事,我不确定“最佳做法”是什么。基本上我想从函数返回一个“指针”,但要求用户将它保存在一个智能指针中。不仅如此,我不想强​​制使用特定的智能指针(共享与作用域)。问题主要在于似乎没有将scoped_ptr升级为shared_ptr的正确方法(我认为这将是理想的解决方案)。我理解他们为什么不这样做,因为这将允许所有权转移,这可能会导致一些问题,例如std::auto_ptr。但是,转让所有权对于这个案例来说似乎是个好主意。所以我的想法是这样的://contrivedexampleoffactor

c++ - 取消引用一个等于 nullptr 的指针是标准未定义的行为吗?

一位博客作者提出了关于空指针解引用的讨论:http://www.viva64.com/en/b/0306/我在这里提出了一些反驳论点:http://bit.ly/1L98GL4他引用标准的主要推理是这样的:The'&podhd->line6'expressionisundefinedbehaviorintheClanguagewhen'podhd'isanullpointer.TheC99standardsaysthefollowingaboutthe'&'address-ofoperator(6.5.3.2"Addressandindirectionoperators"):Theop

c++ - 函数参数 : Copy or pointer?

我是C++的新手,有一些问题,这就是其中之一。当你使用一个接受一个或多个参数的函数时,你知道这些参数在函数调用之前总是存储在一个变量中,是否有任何原因传递变量的拷贝,而不是指针到变量?我说的是性能。在我看来,传递整个结构的拷贝比仅仅传递一个指针(4字节)需要更多的资源。 最佳答案 有几种方法可以使传递拷贝比传递指针成本更低。对象等于或小于指针。直接访问值总是比取消引用指针更快。该结构足够小,可以由编译器放入堆栈。在这种情况下,对结构中值的访问是通过索引寻址模式而不是间接索引寻址模式完成的。前者通常更快。想要传递拷贝而不是引用还有其他