草庐IT

c++ - 是否可以通过 const 引用获取参数,同时禁止转换以便不传递临时变量?

有时我们喜欢通过引用获取一个大参数,并且如果可能的话还使引用成为const以表明它是一个输入参数。但是通过将引用设置为const,编译器允许自己转换类型错误的数据。这意味着它效率不高,但更令人担忧的是我认为我指的是原始数据;也许我会使用它的地址,但没有意识到我实际上使用的是临时地址。此代码中对bar的调用失败。这是可取的,因为引用的类型不正确。对bar_const的调用也是错误的类型,但它会自动编译。这对我来说是不可取的。#includeusingnamespacestd;intvi;voidfoo(int&){}voidbar(long&){}voidbar_const(constl

c++ - 如何禁止简单的赋值 MyClass=int?

如果我有一个类具有这样的属性:structMyClass{double**arowofpointers;intcapacity;};现在,如果任务说“确保主函数中的这行代码是合法的:MyClassa(10);//makesavariablewhosetypeisMyClassthathasthecapacityof10但是要确保main函数中的下面这行代码是不合法的:MyClassa=10;不过,main函数中的以下代码行应该是合法的:a=b+c;其中a,b,c均为MyClass类型的变量。我应该制作哪些构造函数?我应该在删除时设置什么吗? 最佳答案

c++ - 禁止使用 __sprintf_chk()

我观察到c++程序使用sprintf,其中此sprintf隐式调用__sprintf_chk()。此__sprintf_chk()似乎通过检查堆栈帧来检查缓冲区溢出。为了我的研究目的,我想知道是否可以使用__sprintf_chk()来禁用它? 最佳答案 尝试将程序中对sprintf的所有调用替换为:sprintf(params...);进入(sprintf)(params...);这将禁用任何基于预处理器的sprintf更改(*仅当sprintf被使用类似函数的宏更改时,如__sprintf_chk的情况)。对于gcc,有选项-f

c++ - 为什么我会禁止在堆中分配?

我最近阅读了很多关于“防止类的堆分配”的内容(参见thisquestion)。我能够理解“如何”,但现在我无法理解“为什么”有人愿意这样做。我想这一定有正当理由,但我就是想不通。简而言之:“为什么我要禁止用户在堆中创建我的类的对象?” 最佳答案 有些类只有在对象在堆栈上实例化时才有意义。例如,提升scoped_ptr,或lock_guard. 关于c++-为什么我会禁止在堆中分配?,我们在StackOverflow上找到一个类似的问题: https://sta

c++ - 是否可以禁止对一小段 C++ 代码使用某些寄存器?

我看过thisquestion已经,但由于以下原因,这两种解决方案都不适合我。我正试图阻止C++代码接触寄存器,而不是汇编,所以clobber列表将不起作用。我想在本地而不是全局执行此操作,因此全局显式寄存器变量太笨重了。是否可以通过某种方式包装一组C++语句来告诉编译器不要使用某些寄存器? 最佳答案 当然不是以便携的方式。C++语义层对这个寄存器一无所知(尽管有一个register关键字)。g++然而例如canallocatearegisterglobally或locally到一个变量,在这种情况下,编译器将永远不会触及该寄存器。

c++ - 在沙盒环境中运行程序时如何禁止系统调用?

我正在查看codepad.org并且while(1)fork给出了以下输出。不允许的系统调用:SYS_fork检查此链接以获取确切的详细信息。http://codepad.org/rNR9mMVv通过谷歌搜索,我了解到他们还禁用了使用套接字的系统调用。不允许的系统调用:SYS_socketcall谁能告诉我如何在沙盒环境中运行程序之前禁用某些系统调用? 最佳答案 通过用具有空stub或异常抛出器而不是真实函数的模拟替换运行时库? 关于c++-在沙盒环境中运行程序时如何禁止系统调用?,我们

c++ - 这是优化器的怪癖还是语言规则禁止优化的结果?

我在玩编译器资源管理器时发现这两个函数在gcc和clang中生成不同的程序集。我预计在内联后它们会产生相同的表达式树,从而产生相同的最佳装配。constexprboolis_nonzero_decimal_digit(charconstc)noexcept{returnc=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'||c=='8'||c=='9';}boolis_decimal_digit_v1(charconstc)noexcept{returnc=='0'||is_nonzero_decimal_digit(c);}bo

c++ - 相同的地址,多个 shared_ptr 计数器,C++ 标准是否禁止?

假设我有如下需求(这只是讨论C++标准的一些想象代码,所以我不会讨论为什么我这样设计它,所以不要打扰我这样的事情:你的设计错误。)T*ptr=newT;shared_ptrp(ptr);shared_ptrq(ptr,SomeDeleterThatDoesnotDeleteButDoSomeOtherStuff());假设逻辑保证p或它的某些拷贝比q的所有拷贝生命周期更长,那么实际上不会有任何问题。我的问题是,它是否被C++标准禁止,例如C++标准明确声明为UB,以便不同的shared_ptr计数器共享相同的地址?谢谢。 最佳答案

c++ - 为什么隐含的 "lambda to function pointer conversion"禁止静态成员的 "by reference"捕获?

C++11标准说(或者至少,我拥有的版本——不是最终版本):Theclosuretypeforalambda-expressionwithnolambda-capturehasapublicnon-virtualnon-explicitconstconversionfunctiontopointertofunctionhavingthesameparameterandreturntypesastheclosuretype’sfunctioncalloperator.我理解为什么无法从有状态lambda中获取函数指针,因为函数指针本身不能保存任何数据。但是当捕获的对象只是一个静态成员/静

c++ - 我如何允许移动构造并禁止类的赋值和复制构造

有没有办法允许移动构造函数并禁止复制构造和赋值。我可以想到几个具有文件指针和缓冲区指针(资源句柄等)的类,它们将受益于复制构造和分配。我正在使用VC2010和GCC4.5.2。我知道我必须在VC2010类header中声明空的私有(private)赋值和复制构造函数,据我所知,GCC允许在方法之后执行某种删除签名来执行相同的操作。如果有人有像这样的骨架类的好例子及其优点,我将不胜感激。提前致谢约翰这里是一个类的例子,我想允许移动但我也想阻止直接分配。复制构造函数和operator=private是不是同样的问题?classLoadLumScanner_v8002:publicILoad