草庐IT

c++ - `const &&` 是否绑定(bind)到所有 prvalues(和 xvalues)?

C++标准定义删除了以下函数;templatevoidref(constT&&)=delete;templatevoidcref(constT&&)=delete;这是为了通过禁止函数绑定(bind)到临时值(右值)来帮助确保函数不被滥用。const&&是否绑定(bind)到所有右值,特别是纯右值?const&&会绑定(bind)到所有“移动的对象”(xvalues;基本上是从std::move或类似的返回的东西)吗?我可以推断它应该如此,但我对此没有任何“证据”。或者相反,是否存在右值(prvalue或xvalue)不会绑定(bind)到const&&的情况?如果是,怎么会这样?注意

c++ - 何时何地使用 xvalue?

我阅读了关于xvalue的标准。它与rvaluereference表达式密切相关。但是在编程的时候,实在找不到需要xvalue的场景。例如:函数myClass&&f()返回一个rvaluereference。所以表达式f()是xvalue。但这有什么用呢?我如何在编程中使用这种技术?如果定义了另一个函数myClassg(),g()和f()有什么区别?在什么情况下我应该使用f()和xvalue而不是g()prvalue? 最佳答案 在您的示例中,您定义了一个返回纯右值的函数g和一个返回xvalue的函数f。它们的共同点是,如果您分别传

c++ - 临时对象是 xvalues 吗?

我目前正在写我的学位论文,它还涉及对C++11背后理论的一些解释,这真的很好,因为C++是我选择的编程语言,而且该标准或多或少是免费提供的(N3337)让自己迷路。然而,我在尝试准确详细地解释新的xvalue类别时遇到了困难。据我所知,临时对象始终是一个xvalue,但我在标准中找不到对此的任何引用。据我所知,函数调用表达式的值类别是具有非引用返回类型,是一个xvalue。该标准说“xvalue是某种涉及右值引用的表达式的结果”,这让我很烦。例如:TestClass{...};testClasscreateObject(){returntestClass();}voidsomeFunc

c++ - 当一个 xvalue 绑定(bind)到一个 const 左值引用时,它的生命周期是否会延长?

如果我写下面的代码:#includeusingnamespacestd;intmain(){cout然后g++提示:foo.cc:Infunction‘intmain()’:foo.cc:7:20:error:takingaddressofxvalue(rvaluereference)好的,感谢Whatarervalues,lvalues,xvalues,glvalues,andprvalues?我知道xvalue意味着它即将“过期”,这是有道理的。但是现在如果我这样做:#includeusingnamespacestd;intmain(){constint&x=(int&&)123;

c++ - 临时对象的数据成员是 C++11 中的 xvalue 吗?

#includeusingnamespacestd;structA{vectorcoll;};voidf(constvector&){}voidf(vector&&){}intmain(){f(A().coll);//Is"A().coll"anxvalue?}C++11是否保证f(A().coll)将调用voidf(vector&&)? 最佳答案 是的。C++14标准,§5.2.5/4.2,给定E1.E2:IfE2isanon-staticdatamemberandthetypeofE1is“cq1vq1X”,andthetype

c++ - 我们什么时候实际上需要 'explicit xvalues' ?

xvalue的定义如下:—Anxvalue(an“eXpiring”value)alsoreferstoanobject,usuallyneartheendofitslifetime(sothatitsresourcesmaybemoved,forexample).Anxvalueistheresultofcertainkindsofexpressionsinvolvingrvaluereferences(8.3.2).[Example:Theresultofcallingafunctionwhosereturntypeisanrvaluereferenceisanxvalue.—en

c++ - `f().a[0]` 是 xvalue 吗?

structS{inta[3]={1,2,3};};S&&f(){returnS();}&f().a;//[Error]takingaddressofxvalue(rvaluereference)&f().a[0];//okinGCC5.1.0andClang3.6.0Ss;&static_cast(s).a;//[Error]takingaddressofxvalue(rvaluereference)&static_cast(s).a[0];//okinGCC5.1.0andClang3.6.05.7Anexpressionisanxvalueifitis:(7.1)—theresu

c++ - 什么是非 POD 对象的 xvalue 和 prvalue 之间允许的使用或行为差异的示例?

Whatarervalues,lvalues,xvalues,glvalues,andprvalues?很好地概述了右值/左值的分类,最近对该问题的回答之一(https://stackoverflow.com/a/9552880/368896)强调了右值“类似于”旧式右值,而新的xvalues允许“左值-喜欢”的行为。但是,请考虑以下代码:classX{};Xfoo(){returnX();}intmain(){foo()=X();//foo()isaprvaluethatsuccessfullyappearsonthelhs}在本例中,表达式foo()是出现在左侧的纯右值,并接受赋值

c++ - xvalues、glvalues和prvalues的真实例子?

我想知道是否有人可以讲述或解释一些xvalues、glvalues和prvalues的现实生活示例?我读过一个类似的问题:Whatarervalues,lvalues,xvalues,glvalues,andprvalues?但我不明白每个人的意思。谁能解释一下这些值在什么情况下很重要,什么时候应该使用它们? 最佳答案 考虑以下类:classFoo{std::stringname;public:Foo(std::stringsome_name):name(std::move(some_name)){}std::string&orig

c++ - 什么是 rvalues、lvalues、xvalues、glvalues 和 prvalues?

在C++03中,表达式可以是rvalue或lvalue。在C++11中,表达式可以是:右值左值xvalueglvalueprvalue两个类别变成了五个类别。这些新的表达方式是什么?这些新类别与现有的右值和左值类别有何关联?C++0x中的右值和左值类别是否与C++03中的相同?为什么需要这些新类别?是WG21神只是想迷惑我们这些凡人? 最佳答案 我想这个文档可能会作为一个不那么简短的介绍:n3055整个屠杀从移动语义开始。一旦我们有了可以移动而不是复制的表达式,突然容易掌握的规则要求区分可以移动的表达式以及移动的方向。根据我的草稿猜