我偶然发现了这段代码来重新建立类不变量:classFoo{//somestuffinherepublic:voidclear(){*this=Foo();//operator=(Foo());//commentedoutinfavorofthelineabove}};我假设对operator=的调用是合法的并且按预期工作,但会创建一个不必要的临时文件,以防类不可移动。因此,手动分配默认值可能会更有效,如果我们想扩展类,这很麻烦且容易出错。*this=Foo(),如果允许的话,可能会更有效,因为我假设复制省略可以在这里工作(不管类是可移动的)。所以我的问题是:*this=Foo();语句
这个问题不太可能帮助任何future的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visitthehelpcenter.关闭9年前。在解决关于http://cppquiz.org的测试时我发现了这段有趣的代码:#includeintf(int&a,int&b){a=3;b=4;returna+b;}intmain(){inta=1;intb=2;intc=f(a,a);//notea,astd::cout我的问题是这个程序是合法的C++还是不合法?我担心严格的别名。
这是确保不会发生隐式类型转换的合法方法吗?#include#includevoidfunc(std::strings){std::coutvoidfunc(T)=delete;intmain(){func("test1");//str.cc:Infunction‘intmain()’://str.cc:13:16:error:useofdeletedfunction‘voidfunc(T)[withT=constchar*]’//func("test1");//^//str.cc:9:6:error:declaredhere//voidfunc(T)=delete;//^//func(
这似乎可行,但我不能100%确定它是否合法,希望得到一些反馈。我有一个从通用基类派生的子类。它类似于奇怪的重复出现的模板模式,但又有所不同。在derived.h中:templateclassDerived:publicT{public:Derived();...andsomeotherstuff...};在derived.cpp中:#include"derived.h"templateDerived::Derived(){...}//definingthevariationsIneedhereavoidslinkererrors//seehttp://www.parashift.com
我刚刚发现,当涉及到模板时,这段代码在g++3.4.2中编译并且可以工作,除非不调用m():templateclassC{Te;public:C():e(0){};voidm(){e=0;};};现在可以创建和使用实例了Cc;在c.m()未被调用之前,没有编译错误,但这是合法的吗? 最佳答案 是的,这是合法的。模板规范是,在实例化方法之前,它不存在,因此编译器不会检查它。这是来自thespec的相关内容:14.7.1-Implicitinstantiation-9-Animplementationshallnotimplicitly
我不是C++专家,但据我所知这段代码应该会失败,因为size不是常量:#includeusingnamespacestd;intmain(intargc,char**argv){intsize=*argv[1]-48;chararray[size];cout当我用gcc(最好是g++)编译它时,为什么它可以工作?./test77/test22 最佳答案 要从堆栈或堆中为变量分配内存,需要知道变量的大小。C++编译器可以自行决定如何分配内存,但C++已经公开了他们希望C++编译器如何处理这种情况,因此C++标准要求编译器供应商公布他们
我很好奇这段代码在C++0x中是否合法。具体来说,函数move_it()中声明的对象是否会正确移动到main()中声明的对象?#include#include#includeusingnamespacestd;classx{public:x(){cout 最佳答案 不,它返回对本地对象的引用,就像左值引用一样。只需按值返回它,让x的假定移动构造函数获取右值。按值返回时,返回的对象是右值。如果幸运的话,NRVO优化将启动(就像以前一样)并以任何方式省略复制。 关于c++-这段代码合法吗?(
我有一个涉及不同类类型对象的应用程序。对象由指针引用。空指针表示关联的对象不存在。目前的调用代码很麻烦,因为每次它使用一个指向对象的指针时,它都会测试指针值是否为空,并采取一些适当的措施它是空的。因为在不存在的情况下要采取的默认操作取决于对象的类型,所以我更愿意在对象本身的类中而不是在调用程序中对其进行编码。这导致如下结构:classC{...voidmember_func()//non-virtual!{if(this){dosomethingwiththeobject...}else{takesomedefaultaction}}...};显然成员函数不能是虚的,因为当对象不存在时
我刚刚意识到我引入的一个错误,令我惊讶的是它编译了,打开常量是否合法?VisualStudio8和Comeau都接受它(没有警告)。switch(42){//simplifiedversion,thiswasn'taliteralinreallifecase1:std::cout 最佳答案 开启常量并非不可能。考虑:voidf(constintx){switch(x){...}}然而,在文字常量上切换几乎没有意义。但这是合法的。编辑:考虑一下,在某些情况下,打开文字会使完美的感觉:intmain(){switch(CONFIG){.
比较悬挂指针合法吗?int*p,*q;{inta;p=&a;}{intb;q=&b;}std::cout请注意p和q如何指向已经消失的对象。这合法吗? 最佳答案 简介:第一个问题是使用p的值是否合法。a被销毁后,p获得了所谓的无效指针值。引自N4430(关于N4430状态的讨论见下面的“注释”):Whentheendofthedurationofaregionofstorageisreached,thevaluesofallpointersrepresentingtheaddressofanypartofthedeallocated