草庐IT

c++ - 从类型 'int&' 的临时类型 'int' 的非常量引用的无效初始化

#includeusingnamespacestd;intfun(int&x){returnx;}intmain(){cout任何人都可以解释错误的原因吗?谢谢 最佳答案 10是一个常量,所以您不能传递对它的引用,只是因为更改常量的整个概念很奇怪。引入引用是为了解决C(和更早的C++)中的一个棘手问题,事实上一切都是按值传递的,如果你想将更改反射(reflect)回调用者,你必须传入一个指针并在函数中取消引用该指针以获取实际变量(用于读取和写入它)。在下一个ISOC标准中,这将是非常重要的好东西。虽然必须使用指针可能会让我们中的一些

c++ - 为常量语法或语义错误赋值?

第二行代码算C++语法错误还是语义错误?inta=7;3=a;在标准的C++上下文无关语法中,我发现这个语句在句法上是有效的。 最佳答案 这不是语法错误,因为语法可以从assignment-expression(5.17)派生到integer_literal这就是语义错误,如5.17所述:Allrequireamodifiablelvalueastheirleftoperandandreturnanlvaluereferringtotheleftoperand.左值是一个语义概念,而不是句法概念。

c++ - C++ 标准中哪里说::delete 可以更改左值?

我遇到了我的第一个编译器,它更改了传递给::delete的左值,但没有将左值清零。以下是正确的:Foo*p=newFoo();Foo*q=p;assert(p!=0);assert(p==q);::deletep;assert(p!=q);assert(p!=0);请注意,删除操作后p不为零,它已从旧值改变。一位同事告诉我,根据他使用一些大型机C++编译器将p更改为0xFFFFFFFF以及将p更改为0的其他编译器的经验,这并不罕见。在C++标准中哪里说允许编译器这样做?通过StackOverflow搜索,我发现了这个问题:Whydoesn’tdeletesetthepointertoN

C ++功能签名接受LVALUE,RVALUE和RVALUE REF

假设我具有以下功能:print_sutff(conststd::stringstuff){std::cout我可以接受:std::stringstd::string&std::string&&对功能代码的外观没有任何影响。但是,可以通过多种方式调用该功能,我想通过这些方式实现以下行为(或尽可能接近它):autopass="astring";print_sutff(pass);在这里,用户不能使用&&我更喜欢&优先考虑lvaue或者:print_sutff("astring");这里是&应调用构造函数。所以我的问题是:有什么方法可以接受lvalue,&am

c++ - xvalues 不是 glvalues 和 rvalues 吗?

我读了这个answer引起我注意的部分是:inti;int*p=&i;int&f();int&&g();inth();h()//prvalueg()//glvalue(xvalue)f()//glvalue(lvalue)i//glvalue(lvalue)*p//glvalue(lvalue)std::move(i)//glvalue(xvalue)记住这个图表我很困惑。如果glvalue是左值或xvalue,rvalue是右值或xvalue,那么说g是不是错误的()是一个左值而不说它也是一个右值?与std::move(i)相同。我的上述代码版本会是什么样子:h()//rvalue(

c++ - C++ 中的引用初始化

有人可以向我解释为什么这两个陈述之间存在差异吗?classA{};constA&a=A();//correctA&b=A();//wrong它说从类型A的临时类型A&的非常量引用的无效初始化为什么const在这里很重要? 最佳答案 非常量引用必须用左值初始化。如果您可以用临时变量初始化它们,那么下面的代码会做什么?int&foo=5;foo=6;//?!const引用具有特殊属性,它们可以延长裁判的生命周期,并且由于它们是const,因此您不可能尝试修改某些内容那不在内存中。例如:constint&foo=5;foo=6;//not

c++ - 一个 VS2010 错误?允许在没有警告的情况下绑定(bind)对右值的非常量引用?

stringfoo(){return"hello";}intmain(){//belowshouldbeillegalforbindinganon-const(lvalue)referencetoarvaluestring&tem=foo();//belowshouldbethecorrectoneasonlyconstreferencecanbebindtorvalue(mostimportantconst)conststring&constTem=foo();}GCC是给出编译错误的好工具:std::string&类型的非常量引用从std类型的临时值初始化无效::字符串VS2008

c++ - add_lvalue_reference_t<T> 和 T& 之间的区别

假设您有一个模板参数T.有什么区别add_cv_t和constvolatileTadd_const_t和constTadd_volatile_t和volatileTadd_lvalue_reference_t和T&add_rvalue_reference_t和T&&add_pointer_t和T*?我为什么要使用add_rvalue_reference_t而不是T&&例如。什么时候选择哪个有什么规则吗? 最佳答案 add_cv_tandconstvolatileTadd_const_tandconstTadd_volatile_ta

C++11:使用 std::move 只对临时对象安全吗?

在我的代码中,我有这样的东西:unordered_multimap>mEntities;...vector>rawEntities;if(qi::phrase_parse(&buf[0],(&buf[0])+buf.size(),EntityParser(),qi::space,rawEntities)){for(auto&propGroup:rawEntities){autosearch=propGroup.find("classname");if(search!=propGroup.end()){//isstealingpropGroupsafe???mEntities.empla

swift - ( swift )错误 : can not invoke '>' with an argument list of type '(UInt32, @lvalue UInt32)'

classViewController:UIViewController{@IBOutletweakvarinputField:UITextField!@IBOutletweakvaroutput:UITextView!varguesses:UInt=0varnumber:UInt32=0vargameOver=falseletMAX_GUESSES:UInt=8@IBActionfuncguess(sender:UIButton){varpossibleGuess:Int?=inputField.text.toInt()ifletguess=possibleGuess{//possi