草庐IT

c++ - 理解左值到右值转换的例子

我很难理解这段代码(来自C++14标准草案[conv.lval]的示例)如何调用g(false)的未定义行为>。为什么constexpr使程序有效?此外,“不访问y.n”是什么意思?在对g()的两次调用中,我们都返回了n数据成员,那么为什么最后一行说它不访问它呢?structS{intn;};autof(){Sx{1};constexprSy{2};return[&](boolb){return(b?y:x).n;};}autog=f();intm=g(false);//undefinedbehaviorduetoaccessofx.noutsideits//lifetimeintn=

c++ - 无法将类型 'int&' 的非常量左值引用绑定(bind)到类型 'int' 的右值

以下代码编译失败:#includeusingnamespacestd;intadd2(constint&x){returnx+2;}templateTadd2T(T&&x){returnadd2(std::forward(x));}intmain(intargc,char**argv){intx=0;cout通过这条消息:main.cpp:Ininstantiationof'Tadd2T(T&&)[withT=int&]':main.cpp:26:20:requiredfromheremain.cpp:12:16:error:cannotbindnon-constlvaluerefer

C++ 左值需要作为一元 '&' 操作数

我正在开发游戏引擎并致力于实现状态设计。我有一个Engine类,它负责所有一切的初始化,并包含调用更新、渲染和处理事件状态的输入函数的游戏循环。我所有的不同状态都继承自State,它需要在其构造函数中引用Engine类,以便初始化引擎的protected引用以供将来使用。这是相关代码://file:state.hclassEngine;classState{public:State(Engine&engine):mEngine(engine){}protected:Engine&mEngine;};//file:gamestate.hclassGameState:publicState

c++ - 右值引用绑定(bind)到 std::function 类型的左值

为什么下面的代码在(@)处没有编译错误?我认为lamb是左值,因此它不会绑定(bind)到右值引用。usingFunctionType=std::function;usingIntType=int;structFoo{voidbar(FunctionType&&){}voidbaz(IntType&&){}};Foofoo;foo.bar([](){});//OKautolamb=[](){};foo.bar(lamb);//(@)Nocompilationerror?!foo.baz(5);//OKinti=5;foo.baz(i);//Error 最佳答

c++ - 右值和左值引用

我有一个函数printInt,如下所示。voidprintInt(constint&a){cout当我使用以下参数调用like函数时inta=5;printInt(a);printInt(5);它工作得很好。但是当我将函数定义更改为voidprintInt(int&a){cout这会导致调用printInt(5)出错。现在我的问题是为什么constint&既是左值引用又是右值引用,而int&只是左值引用。据我所知int&&是右值引用。那么单个&如何引用右值引用呢?总结一下我的问题:左值引用参数voidprintInt(int&a){cout右值引用参数voidprintInt(int&

C++ 左值和右值

好的,所以我一直在学习左值和右值-精通C/C++的人可以告诉我我的想法是否正确吗?考虑代码:inti=3;intj=i;这里我们有两个左值i和j,当i被赋值给j时,它就变成了一个隐含的右值,因为i的拷贝存储在j中。但是,如果代码看起来像:inti=3;intj=&i;j和&i是否都是左值,因为它们都是内存中的物理地址?我的理解是右值是临时数据,而左值有一个物理/可引用的内存地址。任何对此的澄清都会很棒! 最佳答案 变量i永远是一个左值。如果您可以将地址运算符应用于某物(就像您在第二个示例中所做的那样),那么它就是一个左值。同样在第二

c++ - 为什么右值引用会被通用引用变成左值引用

我想当通用引用参数与右值引用参数匹配时,将返回右值引用参数。然而,我的测试表明右值引用被通用引用函数模板变成了左值引用。为什么会这样?#include#includeusingnamespacestd;templateTf1(T&&t){//::value::value::value::value::value::value在GCC和VC++2010中,都是这样的结果:f2is_lvaluereference:0f2is_rvaluereference:1f2is_reference:1is_lvaluereference:1is_rvaluereference:0is_referen

c++ - 这个表达式是左值还是右值?

看看这个表达式:Tt;T&ref=t;ref表达式是左值还是右值?我相信它是右值因为ref没有“指定函数或对象”:"Anlvalue(socalled,historically,becauselvaluescouldappearontheleft-handsideofanassignmentexpression)designatesafunctionoranobject."[开放标准草案n3092]根据cppreference,引用不是对象。"Thefollowingentitiesarenotobjects:value,reference[...]"我有疑问,因为ref在=的左侧。

C++11 左值、右值和 std::move()

我有以下代码:#includeusingnamespacestd;voidtest(int&a){cout哪些输出:lvalue.rvaluelvalue.lvalue.std::move()和int&&是右值引用,我想知道为什么test(std::move(a))和test(b)输出左值?与签名匹配和函数重载有关吗? 最佳答案 输出应该是:lvalue.rvaluervaluelvalue.右值表达式和右值引用类型的表达式之间有一个非常重要的区别。b的类型是对int的右值引用,但表达式b是左值;它是一个变量,你可以取它的地址。这就

c++ - 左值引用和右值引用的区别

我一直在研究C++11中的右值引用加法。这并不简单,但我觉得我终于开始掌握它了。但是,有一个特定的例子让我感到困惑。具体来说,我不明白这个例子中“b”的含义是什么:inta=27;int&&b=27;编辑:我知道inta=27是左值而不是左值引用。此外,我寻找的不是int&&b=27是什么,而是直觉上它的含义是什么。我很困惑,因为我认为右值不可寻址,但这里我们有一个对右值的引用,这意味着我们可以寻址它。那么为什么它仍然是右值呢? 最佳答案 inta=27;是一个语句,既不是左值也不是右值。它定义了namea,它可以用作int类型的左