草庐IT

C++ 左值和右值

全部标签

c++ - const 引用右值的类数据成员的生命周期是多少?

通常这个讨论只针对局部函数变量:voidfoo(constint&i){//useitillfoo()ends}foo(3);但是,这条规则是否也适用于class成员?structA{constint&a;A():a(3){}//version1A(constint&i):a(i){}//version2};现在A用作,{return()?newA:newA(3):newA(some_local_variable);}a的内容是否会在all3的整个生命周期内保持不变新分配A? 最佳答案 C++03标准(“12.2/5临时对象”部分)

c++ - 为什么 int 不能用作返回类型的左值,而用户定义的类可以?

structA{};Af1(){returnA();}intf2(){returnint();}intmain(){f1()=A();//OKf2()=int();//errorC2106:'=':leftoperandmustbel-value}为什么f1()=A();正常而f2()=int();失败? 最佳答案 f1()返回A的实例。由于您没有覆盖复制/移动赋值运算符,因此编译器会为您生成一个。您实际上是在调用成员函数:f1()=A();//callsA&operator=(A&&)第二个不起作用,因为int不是类类型。

c++ - 隐式转换为左值引用

我正在查看标准5.16第3段,试图了解发生了什么。考虑类型M定义为structM{M();M(constM&);M(M&&);};如果我有一个三元表达式pred?E1:E2,其中E1的类型是constM&,E2的类型是M&&5.16第3段第1点是否适用?—IfE2isanlvalue:E1canbeconvertedtomatchE2ifE1canbeimplicitlyconverted(Clause4)tothetype“lvaluereferencetoT2”,subjecttotheconstraintthatintheconversionthereferencemustbin

c++ - 使用 std::move() 创建右值引用变量是否有任何用处。 [C++]

有人可以帮助修正我对std::move的理解吗?我认为如果右值引用超出范围,如果它是使用std::move运算符分配的,它所引用的内容也会超出范围。为什么下面的代码不是这种情况?#includeusingnamespacestd;intmain(){stringone="1-one";stringtwo="2-two";{//notasexpectedstring&lValRef=one;string&&rValRef=std::move(two);stringnewS(rValRef);}cout你可以摆弄它here.我一直认为使用std::move是一种让对象处于“可删除状态”的方

c++ - 将右值引用分配给左值引用

int&&rv=10;int&lv=rv;//noerror这怎么可能?这与“引用折叠规则”有关吗? 最佳答案 int&&rv=10;int&lv=rv;//noerror首先,命名对象绝不是右值。其次,由于rv是命名对象,因此它不是右值,即使它绑定(bind)到右值。由于rv是左值,它可以毫无问题地绑定(bind)到左值。请注意,右值特性是表达式的属性,而不是变量。在上面的示例中,右值是从10中创建的,并绑定(bind)到rv,正如我所说,它是左值。 关于c++-将右值引用分配给左值引

c++ - 为什么 move 返回一个右值引用参数需要用 std::move() 包装它?

我正在阅读EffectiveModernC++Item25,第172页,它有一个例子来证明,如果你想移动返回一个右值引用参数,你需要用std::move(param)包装它。由于参数本身总是一个左值,如果没有std::move(),它将被复制返回。我不明白。如果std::move(param)只是将它接收的参数转换为右值引用,那么当param已经是右值引用时有什么区别?像下面的代码:#include#include#includetemplateclassTD;classWidget{public:explicitWidget(conststd::string&name):name(n

c++ - 右值引用和 SFINAE

我最近开始使用右值引用,但我遇到了一个案例,我不明白为什么它们会这样工作。我正在尝试确定一个类型是否可以调用begin和end。如果我更改foo以按值或const引用获取它的参数,下面的代码会给出预期的结果,但我不确定为什么在使用右值引用时它不起作用,我想知道是否谁能告诉我为什么。#include#include#includetemplateautobegin(Container&&c)->decltype(c.begin()){returnc.begin();}templateautoend(Container&&c)->decltype(c.end()){returnc.end(

c++ - 如何在 C++ 中使用右值引用来避免不必要的实例

我想创建一个自定义容器Container将数据存储在单独的数组中。但是,为了便于对容器进行迭代,我通过重载operator[]并返回一个包含所有容器变量的结构Value来提供容器的“View”对实际容器的引用。这是我到目前为止得到的:#includeusingnamespacestd;structValue{Value(int&data):data_(data){}int&data(){returndata_;}int&data_;};structContainer{ValuemakeValue(inti){returnValue(data_[i]);}//EDIT1Value&&op

c++ - 参数传递与右值的混淆?

我对通过函数调用传递右值有点困惑,请参阅下面的代码:#include#includevoidfunc(std::string&s,chara){std::cout为什么最后一个案例(使用foo)打印here1?在我看来,在函数foo中,s是一个右值,所以它会打印here2。更新:foo中的s是一个左值,但是没有必要写foo的重载版本:voidfoo(std::string&s){func(s,':');}因为编译器可以知道输入参数s是右值还是左值,但为什么编译器在右值情况下不自动moves? 最佳答案 foo的声明:voidfoo(

c++ - 是 int & foo();一个左值?

我知道可能还有其他类似的问题,但他们没有完全回答我的问题。我一直在浏览有关C++类型推导的讲座中的一些幻灯片,在其中一张中我发现了以下语句:int&foo();//foo()islvalue;起初,我以为这是错误的——foo是一个函数,它不能被赋值,它不是一个左值。但现在我想作者可能有不同的想法。也就是说,函数调用可能是左值,而不是函数本身。换句话说:foo是左值吗?foo()是左值吗?是否可以将函数(不是函数调用)分配给(即foo=something;)?“左值是可以分配给的每个对象/事物”-这个陈述总是正确和准确的吗?问题4需要更多解释。有了它,我试图理解什么是左值。我看到的另一个