草庐IT

C++ 左值和右值

全部标签

c++ - 为什么有的引用类型的变量可以绑定(bind)右值,有的不能?

#includeusingnamespacestd;intmain(){//int&a=3;我不明白为什么编译器不会引发编译错误。由于auto“强制”c成为对常量int的引用,并且引用被引用到左值,这是如何工作的? 最佳答案 如果没有const,这确实无法工作——您会遇到编译错误。但是const在那里,即您不会修改c引用的内容。对于这种情况,标准中有额外的措辞,临时值c正在引用(1+2的结果)将其生命周期延长到引用生命周期的末尾。这与auto完全无关。const在这里产生了不同。 关于c

c++ - 为什么指向函数的指针不能绑定(bind)到左值引用,而函数可以?

使用带和不带符号的函数名有什么区别?我注意到它们在绑定(bind)到模板参数时以不同的方式表现:voidfoo();templatevoidbind(F&);bind(foo);//OKbind(&foo);//Error为什么会这样?这些情况下的推导类型是什么? 最佳答案 注意内置的operator&将返回T*类型的prvalue。所以&foo将返回一个类型为void(*)()的函数指针,它是一个纯右值,不能绑定(bind)到非常量的左值引用;这正是bind()期望的参数,然后它失败了。对于bind(foo),templatepa

c++ - 左值引用和右值引用中的绑定(bind)错误

voidf(int&i){cout假设上面的代码,我们有一个重载函数,它分别接受l-value-reference和r-value-reference参数。intx=5;f(x);f(5);constintj=9;f(j);当我使用constintj=9时,编译器给出了歧义错误。我怎么解决这个问题? 最佳答案 您的编译器错误(如果确实是您提到的错误)具有误导性。这里真正错误的是,尝试将constint参数传递给您的任何函数都会丢弃const限定符,这是不允许的。您可以通过将签名更改为constint&/constint&&来解决它(

c++ - 当左值引用参数和右值引用参数作为相同的转发引用类型传递时,为什么它不起作用?

#includetemplatevoidf(T&&a,T&&b){}intmain(){intn;f(n,std::move(n));}T&&是转发引用类型,所以我觉得decltype(a)应该是int&和decltype(b)应该是int&&。但是,上面的代码会产生以下错误:main.cpp(13,2):error:nomatchingfunctionforcallto'f'f(n,std::move(n));main.cpp(7,6):note:candidatetemplateignored:deducedconflictingtypesforparameter'T'('int&

c++ - 什么是可修改的右值?

有人能举个“可修改右值”的例子吗?我的理解是右值出现在表达式中“=”的右边。我测试了下面的例子,但我不确定它是否解释了“可修改的右值”inti=1int&j=i;j=2;//cout:i==2, 最佳答案 这在某种程度上取决于短语“可修改的右值”的上下文。然而,这是一个可能的例子:structModifiable{intx;voidmodify(){std::coutdemo()的返回值是一个右值(事实上,甚至是纯右值),但是通过调用modify()进行了修改。[Liveexample]

c++ - 为什么作为返回类型的右值引用不能初始化非常量引用?

我读了this问题,我知道右值引用是左值。然而,对于这段代码,例子1,int&&fun(){return1;}intmain(){int&a=fun();}当我编译它时:error:invalidinitializationofnon-constreferenceoftype'int&'fromanrvalueoftype'int'所以C++编译器告诉我fun的返回类型是右值。右值引用如何变成右值?我认为编译器应该以相同的方式对待左值引用和右值引用,但是这段代码,示例2,int&fun(){intb;returnb;}intmain(){int&a=fun();}可以编译(尽管如此,我

c++ - 获取 const 左值引用的地址是否合法?

#includeintfoo(){return0;}intmain(){constint&a=foo();std::cout在这段代码中,a绑定(bind)到一个右值。取它的地址合法吗?(我的法律意思是:在代码中格式不正确?我是否导致了未定义的行为?) 最佳答案 这很好。在C++11中,您甚至可以这样做:int&&a=foo();a=123;您可以这样考虑临时对象(概念上和一般情况下):x=func();//translatedas:auto__temporary=func();x=__temporary;__destruct_va

c++ - 地址不能取什么样的左值?

在thisconference,ScottMeyers首先说“左值通常是你可以取地址的表达式”。我一般强调这个词:什么是你不能获取地址的左值?(如果存在的话)。编辑:请提供包含您的答案的代码片段,这会让事情更清楚。 最佳答案 我认为位域满足你的条件...我相信f.x是一个左值,但你不能获取它的地址。有趣的是,您也不能执行auto&x=f.x。C++11Section8.3.1PartofParagraph4:Sincetheaddressofabit-field(9.6)cannotbetaken,apointercanneverp

c++ - 右值引用和文字

考虑代码templatevoidfoo(Args&&...){}templatevoidbar(Args&&...args){foo(std::forward(args)...);}intmain(){bar(true);}~gcc4.7.2给出错误error:nomatchingfunctionforcallto‘forward(bool&)’note:candidatesare:templateconstexpr_Tp&&std::forward(typenamestd::remove_reference::type&)note:templateargumentdeduction/

c++ - 为什么我不能按值将右值 std::stringstream 传递给函数?

为什么这段代码不能编译?#includevoidf(std::stringstream){}intmain(){f(std::stringstream{});}我收到这个错误:error:useofdeletedfunction‘std::basic_stringstream::basic_stringstream(conststd::basic_stringstream&)’f(std::stringstream{});^如果我将std::stringstream替换为另一种不可复制的类型,它就可以正常工作。这不应该使用stringstream的move构造函数吗?