草庐IT

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++ - 右值结构的成员是右值还是左值?

返回结构的函数调用是一个右值表达式,但它的成员呢?这段代码在我的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

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

c++ - 为什么预增量运算符在 C 中给出右值?

在C++中,预增量运算符给出左值,因为返回的是自增对象本身,而不是拷贝。但在C中,它给出了右值。为什么? 最佳答案 C没有引用。在C++中++i返回对i的引用(lvalue)而在C中它返回一个拷贝(增量)。C996.5.3.1/2Thevalueoftheoperandoftheprefix++operatorisincremented.Theresultisthenewvalueoftheoperandafterincrementation.Theexpression++Eisequivalentto(E+=1).‘‘valueof

c++ - 为什么预增量运算符在 C 中给出右值?

在C++中,预增量运算符给出左值,因为返回的是自增对象本身,而不是拷贝。但在C中,它给出了右值。为什么? 最佳答案 C没有引用。在C++中++i返回对i的引用(lvalue)而在C中它返回一个拷贝(增量)。C996.5.3.1/2Thevalueoftheoperandoftheprefix++operatorisincremented.Theresultisthenewvalueoftheoperandafterincrementation.Theexpression++Eisequivalentto(E+=1).‘‘valueof

c++ - 为什么分配给 substr 调用的结果不是编译器错误?

我刚刚发现了最令人困惑的错误,我不明白为什么编译器没有为我标记它。如果我写以下内容:strings="abcdefghijkl";cout编译器对此没有任何问题,并且根据打印出来的内容,赋值语句似乎没有效果。相比之下,s.front()='x';具有改变底层字符串的效果(因为front返回对字符的引用),并且s.length()=4;还具有生成编译器错误的预期效果,提示您不能分配给不是左值的东西,因为length返回一个整数。(嗯,一个size_t反正。)那么...为什么编译器不提示分配给substr调用的结果?它返回一个字符串值,而不是引用,所以它不应该是可分配的,对吧?但是我已经在