草庐IT

c++ - 错误 : cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’

我已经看过几个关于这个的问题,特别是Overloadingoperator&&’很有帮助。它让我知道我的问题是我正在做一些c++11无法从中推断出类型的事情。我认为我的问题的很大一部分是我正在使用的实例化类是模板化的,但最初是从指向非模板基类的指针中获得的。这是我从另一个关于如何将模板类对象放入STL容器的stackoverflow.com问题中建议的。我的课:classDbValueBase{protected:virtualvoid*null(){returnNULL;}//Neededtomakeclasspolymorphic};templateclassDbValue:pub

c++ - 关于如何识别 Rvalue 或 Lvalue 引用和 if-it-has-a-name 规则

我正在阅读ThomasBecker的article关于右值引用及其使用。在那里,他定义了他所谓的if-it-has-a-name规则:Thingsthataredeclaredasrvaluereferencecanbelvaluesorrvalues.Thedistinguishingcriterionis:ifithasaname,thenitisanlvalue.Otherwise,itisanrvalue.这对我来说听起来很合理。它还清楚地标识了右值引用的右值性。我的问题是:你同意这个规则吗?如果没有,您能否举一个可能违反此规则的示例?如果没有违反这条规则。我们可以使用此规则来

c++ - 函数将结构返回为 LValue

在下面的代码片段中,为什么行o.margin()=m;编译没有错误?它很容易得到警告,因为它几乎总是一个错误。我实际上会认为这是一个错误,因为它会将R值放在赋值的左侧。#includestructMargin{Margin(intval=0):val(val){};intval;};structOption{Marginm;intz=0;Marginmargin()const{returnm;}intzoomLevel(){returnz;}};intmain(){Optiono;std::cout输出:Marginis:0Marginis:0 最佳答案

c++ - 重载运算符<< : cannot bind lvalue to ‘std::basic_ostream<char>&&’

我有一个使用嵌套类的类,并且想使用嵌套类operator定义operator在上层类(Class)。这是我的代码的样子:#include#includetemplatestructclassA{structclassB{templatefriendinlinestd::ostream&operator::classB&b);};classBroot;templatefriendstd::ostream&operator&tree);};templateinlinestd::ostream&operator&tree){outinlinestd::ostream&operator::cl

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

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

c++ - 右值结构的成员是右值还是左值?

返回结构的函数调用是一个右值表达式,但它的成员呢?这段代码在我的g++编译器中运行良好,但gcc给出错误提示“需要左值作为赋值的左操作数”:structA{intv;};structAfun(){structAtmp;returntmp;}intmain(){fun().v=1;}gcc将fun().v视为右值,我可以理解。但是g++并不认为赋值表达式是错误的。这是否意味着fun1().v在C++中是左值?现在的问题是,我搜索了C++98/03标准,没有发现fun().v是左值还是右值。那么,它是什么? 最佳答案 右值表达式的成员是

c++ - 右值结构的成员是右值还是左值?

返回结构的函数调用是一个右值表达式,但它的成员呢?这段代码在我的g++编译器中运行良好,但gcc给出错误提示“需要左值作为赋值的左操作数”:structA{intv;};structAfun(){structAtmp;returntmp;}intmain(){fun().v=1;}gcc将fun().v视为右值,我可以理解。但是g++并不认为赋值表达式是错误的。这是否意味着fun1().v在C++中是左值?现在的问题是,我搜索了C++98/03标准,没有发现fun().v是左值还是右值。那么,它是什么? 最佳答案 右值表达式的成员是

C++0x const RValue 引用作为函数参数

我试图理解为什么有人会编写一个采用constrvalue引用的函数。在下面的代码示例中,constrvalue引用函数的用途是什么(返回“3”)。以及为什么重载解析优先于constLValue引用函数(返回“2”)之上的constRvalue。#include#include#includestd::vectorcreateVector(){returnstd::vector();}//takesmovablervaluevoidfunc(std::vector&&p){std::cout&p){std::cout&&p){std::cout 最佳答案

C++0x const RValue 引用作为函数参数

我试图理解为什么有人会编写一个采用constrvalue引用的函数。在下面的代码示例中,constrvalue引用函数的用途是什么(返回“3”)。以及为什么重载解析优先于constLValue引用函数(返回“2”)之上的constRvalue。#include#include#includestd::vectorcreateVector(){returnstd::vector();}//takesmovablervaluevoidfunc(std::vector&&p){std::cout&p){std::cout&&p){std::cout 最佳答案

c++ - 是否有原因 declval 返回 add_rvalue_reference 而不是 add_lvalue_reference

将类型更改为类型的reference,允许访问该类型的成员而无需创建该类型的实例。lvaluereferences和rvaluereferences似乎都是如此。declval是用add_rvalue_reference而不是add_lvalue_reference实现的,这只是一个约定吗,或者有没有使用add_rvalue_reference更可取的例子?编辑:我想我有点含糊,这些答案都很好,但触及的点略有不同。建议使用两种不同的答案,Howard强调您可以选择您的类型所具有的引用,从而使add_rvalue_reference更加灵活。其他答案强调默认行为会自动选择更自然地反射(r