考虑下面的最小示例:#includestructS{};intmain(){Ss;std::move(s)=S{};}它编译没有错误。如果我改为使用非类类型,则会收到错误。例如,以下代码无法编译:#includeintmain(){inti;std::move(i)=42;}枚举、作用域枚举等也是如此。错误(来自GCC)是:usingxvalue(rvaluereference)aslvalue这背后的原理是什么?我想这是对的,但我想了解我可以对除非类之外的所有类型执行此操作的原因是什么。 最佳答案 C++允许对类对象右值进行赋值,
有点令人惊讶(对我来说),以下两个程序编译成不同的输出,后一个具有更好的性能(用gcc和clang测试):#includeintmain(){std::vectora(2b(2对比#includeintmain(){std::vectora(2b(2有人可以向我解释为什么编译器会(或不能)在最后一次赋值中自动将b视为xvalue并在没有显式std::move的情况下应用move语义>Actor?编辑:用(g++|clang++)-std=c++11-O3-otesttest.cpp编译 最佳答案 Compilerscan'tbrea
有点令人惊讶(对我来说),以下两个程序编译成不同的输出,后一个具有更好的性能(用gcc和clang测试):#includeintmain(){std::vectora(2b(2对比#includeintmain(){std::vectora(2b(2有人可以向我解释为什么编译器会(或不能)在最后一次赋值中自动将b视为xvalue并在没有显式std::move的情况下应用move语义>Actor?编辑:用(g++|clang++)-std=c++11-O3-otesttest.cpp编译 最佳答案 Compilerscan'tbrea
RecentlyI'vediscovered有时能够临时将右值转换为左值对我有用。我一直在使用以下工具:#includetemplateinlineconstexprstd::remove_reference_t&lvalue(T&&r)noexcept{returnstatic_cast&>(r);}当您必须使用需要左值的函数时,它很有用争论,但你对那些特别的东西没有任何兴趣值变成。当您对其他输出感兴趣时与给定的特定参数无关的vector。例如,这个:std::stringget_my_file(){std::ifstreamifs("myfile.txt");return{std:
RecentlyI'vediscovered有时能够临时将右值转换为左值对我有用。我一直在使用以下工具:#includetemplateinlineconstexprstd::remove_reference_t&lvalue(T&&r)noexcept{returnstatic_cast&>(r);}当您必须使用需要左值的函数时,它很有用争论,但你对那些特别的东西没有任何兴趣值变成。当您对其他输出感兴趣时与给定的特定参数无关的vector。例如,这个:std::stringget_my_file(){std::ifstreamifs("myfile.txt");return{std:
我试图理解C++11中的左值和右值。于是我写了一段测试代码:intx=10;intfoo(){returnx;}int&bar(){returnx;}int&&baz(){return10;}intmain(){int&lr1=10;//error:lvaluereferencesrvalueint&lr2=x;//okint&lr3=foo();//error:lvaluereferencesrvalueint&lr4=bar();//okint&lr5=baz();//error:lvaluereferencesrvalueint&&rr1=10;//okint&&rr2=x;//
我试图理解C++11中的左值和右值。于是我写了一段测试代码:intx=10;intfoo(){returnx;}int&bar(){returnx;}int&&baz(){return10;}intmain(){int&lr1=10;//error:lvaluereferencesrvalueint&lr2=x;//okint&lr3=foo();//error:lvaluereferencesrvalueint&lr4=bar();//okint&lr5=baz();//error:lvaluereferencesrvalueint&&rr1=10;//okint&&rr2=x;//
在cppreferncesection:Valuecategories,它指出“对象表达式的成员,其中a是右值,m是非引用类型的非静态数据成员”是一个xvalue。在标准中(我在:N4140,thedraftC++14standard中找到)它声明(在第87页)“表达式是一个xvalue,如果它是......一个类成员访问表达式,指定非引用类型的非静态数据成员其中对象表达式是一个xvalue。”我想用下面的代码检查我对此的理解:structB{//BforBoring...inti{0};};templatestructV{V(){coutstructV{//PartialSpecia
几个星期以来,我一直在仔细研究右值和右值引用。我越来越有信心,我对以下两者之间的区别有了一定的了解:定义变量或函数参数的类型(即intx;与int&&x=…;表达式的表达式类别,包括那些可能使用先前定义的参数的表达式(即给定函数定义A&&foo(),以及给定的表达式仅包含foo()的表达式类别是“xvalue”)子表达式在包含表达式中使用时的子表达式求值结果的类型(即,给定foo的相同定义,在包含表达式中使用时,子表达式foo()的类型是A(不是A&&))。我的问题是关于xvalue表达式和prvalue表达式(这两个表达式类别都是右值)之间的区别。给定:classA{};A&&foo
C++11引入了新的值类别,其中之一是xvalue.是explained由Stroustrup描述为类似(im类别):“它是一个值,具有身份,但可以从中move”。另一个来源,cppreference解释:aglvalueisanexpressionwhoseevaluationdeterminestheidentityofanobject,bit-field,orfunction;和xvalue是glvalue,所以这句话对于xvalue是正确的也是。现在,我认为如果xvalue有身份,那么我可以检查两个xvalues指的是同一个对象,所以我取xvalue的地址.事实证明,这是不允许