草庐IT

C++ 左值和右值

全部标签

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++ - 为什么 `auto&` 不能绑定(bind)到 volatile 右值表达式?

考虑下面的代码:intmain(){inti{};auto&c=static_cast(i);//(1)auto&v=static_cast(i);//(2)}(1)编译成功,(2)不被接受:error:volatilelvaluereferencetotype'volatileint'cannotbindtoatemporaryoftype'volatileint'为什么auto不能变成volatileint?为什么auto&可以变成constint并绑定(bind)到constint&&?是因为auto&实际上绑定(bind)到一个在赋值右侧创建的临时对象吗?但是,为什么auto&

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++ - Visual C++ 2010,右值引用错误?

这是VisualC++2010中的错误还是正确的行为?templateTf(Tconst&r){returnr;}templateTf(T&&r){static_assert(false,"noway");//我想,函数f(T&&)永远不应该被调用,但它是用T=int&调用的。输出:main.cpp(10):errorC2338:nowaymain.cpp(17):seereferencetofunctiontemplateinstantiation'Tf(T)'beingcompiledwith[T=int&]Update1DoyouknowanyC++x0compilerasare

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++ - std::string 参数的右值

我传文的时候,下面代码中的LVALUE和RVALUE在实践中有什么区别?我的意思是,在字符串的这种特定情况下(其中字符串是字符串文字),使用RVALUE(&&)有什么好处吗?voidwrite_Lvalue(conststd::string&text){//...}voidwrite_Rvalue(conststd::string&&text){//...}intmain(){write_Lvalue("writingtheLvalue");write_Rvalue("writingtheRvalue");} 最佳答案 首先,常量右

c++ - 右值引用和完美转发

我读过一些关于&&的论文,我只是好奇是否有:voidfnc_1(int&&p){//...}voidfnc(int&&r){fnc_1(r);//amIsupposeto/shouldI?callitlikeso:fnc_1(std::forward(r))}还是只传递'r'就足够了? 最佳答案 fnc_1(r)不会编译,因为r是一个左值,就像任何其他变量一样,无论类型如何。是的,没错,命名右值引用是左值,而不是右值。fnc_1(std::forward(r))也不会编译,因为std::forward专门设计为不推断其模板参数。要传

c++ - 函数的右值引用和返回值

我是c++11的新手,在阅读C++11FAQ时有以下问题.假设我们有一个函数f(),它返回一个类型为X的值,那么我们有以下方法来存储它的返回值:Xa=f();//copyassignmentX&&b=f();//moveassignment根据C++FAQ,第二个避免了不必要的复制。我的问题是:第二种方式是否总是接收函数调用返回值的首选方式?另外,autoc=f();是否等同于上述赋值之一?谢谢。 最佳答案 您错误地标记了这些行。它们都不是作业,更不用说分别复制和move作业了。相反,第一个涉及复制/move构造(取决于X是否有一个

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&