lvalue相关内容
在C89标准中,我找到以下部分: 3.2.2.1 L值和功能指示符 除非它是sizeof运算符、一元&;运算符、++运算符、--运算符或的左操作数的操作数。运算符或赋值运算符,则不具有数组类型的左值将转换为存储在指定对象中的值(不再是左值)。如果左值具有限定类型,则该值具有左值类型的非限定版本;否则,该值具有左值类型。如果左值的类型不完整并且没有数组类型,则行为未定义。 如果我
..
class scope{ //... scope* parent; //... public: //... void leavescope(); //... }; void scope::leavescope(){ this = this->parent; // complains about this line
..
整个程序基本上只允许用户移动光标,如果用户在给定的坐标范围 (2,2) 内,则允许用户键入输入.我刚刚提供了一些我认为足以解决问题的代码. 我不知道是什么导致了这个问题.你能解释一下为什么会这样吗? void goToXY(int ,int); 用两个整数创建了一个函数. int X = 0, Y = 0; 初始化两个整数. if(X = 2 && Y = 2){cin>>输入;}
..
我有以下代码 字符串三(){返回“三";}void mutate(string& ref){}主函数(){变异(三());返回0;} 你可以看到我正在将 three() 传递给 mutate 方法.这段代码编译得很好.我的理解是,不能将临时对象分配给非常量引用.如果是,这个程序是如何编译的? 有什么想法吗? 编辑: 尝试过的编译器:VS 2008 和 VS2010 Beta
..
在 R 中,“assign('x',v)"将名称为 'x' 的对象设置为 v.将 'x' 替换为将文本函数应用于变量 x 的结果.然后“分配"显示它的价值. 很遗憾,“assign(paste('names(','x',')',sep=''),v)"失败了.所以如果 'x' 是一个变量 x,我可以设置它的值,但我不能给它的元素命名. 可以解决这个问题吗?也许是解析评估技巧?谢谢.
..
我这里有char text[60]; 然后我在 if 中做: if(number == 2)文字=“真棒";别的text = "你失败了"; 它总是说表达式必须是一个可修改的L值. 解决方案 lvalue 表示“左值";- 它应该是可分配的.你不能改变 text 的值,因为它是一个数组,而不是一个指针. 要么将其声明为 char 指针(在这种情况下,最好将其声明为 cons
..
我需要一些关于这种奇怪行为的建议——让我们看看这段代码: int ** p; 编译没有任何问题: p++; 但是这个: ((int**)p)++; 给我这个错误信息:“error: lvalue required as increment operation". 我正在将 p 转换为它已经是的类型,没有任何变化,那么问题是什么?这是我遇到的问题的简化版本,当我试图编译一个旧的gd
..
我知道在 c++03 中,非常量引用不能绑定到右值. T&t = getT(); 无效,在 C++11 中,我们可以这样做:T&&t = getT(); 但是上面的代码怎么样,在 c++11 中能用吗? 我用 vs11 测试了下面的代码: Foo getFoo() {返回 Foo();}void fz(Foo& f) {}int getInt() {返回整数();}void iz(
..
为什么第一个返回一个引用? int x = 1;int y = 2;(x > y ? x : y) = 100; 虽然第二个没有? int x = 1;长 y = 2;(x > y ? x : y) = 100; 实际上,第二个根本没有编译 - “不是左值赋值". 解决方案 表达式没有返回类型,它们有一个类型和 - 正如最新的 C++ 标准中所知 - 一个值类别. 条件表达式
..
让 int a = 0; 那么(int)a是标准C++中的rvalue吗? 不同的编译器对此代码显示不同的结果: #include 使用命名空间标准;void f(int& x){cout
..
string foo() { return "hello";}int main(){//下面将非常量(左值)引用绑定到右值应该是非法的字符串&tem = foo();//下面应该是正确的,因为只有const引用可以绑定到右值(最重要的const)const string&constTem = foo();} GCC 是给出编译错误的好方法:从 类型的临时对象对 std::string& 类型的非
..
在此处发布我最有争议的答案之一后,我敢问几个问题,最终填补了我的一些知识空白. 为什么 ((type_t *) x) 类型的表达式不被认为是有效的左值,假设 x 本身是一个指针和一个左值,而不是只是一些表达? 我知道很多人会说“标准不允许",但从逻辑的角度来看,这似乎是合理的.标准不允许的原因是什么?毕竟,任何两个指针的大小都相同,指针类型只是一个编译时抽象,表示在进行指针运算时应该应
..
我发布了这个答案:https://stackoverflow.com/a/28459180/2642059 其中包含以下代码: void foo(string&& bar){string* temp = &bar;cout
..
int main(){int a = 5,b = 2;printf("%d",a+++++b);返回0;} 此代码给出以下错误: 错误:需要左值作为增量操作数 但是如果我在 a++ + 和 ++b 中放置空格,那么它工作正常. int main(){int a = 5,b = 2;printf("%d",a++ + ++b);返回0;} 第一个例子中的错误是什么意思? 解决
..
我是 C 新手,今天我学会了“?"运算符,它是 if-else 语句的短类型.但是,当我执行此代码时: int b;整数 x;b=3 我收到一个错误“错误:左值需要作为赋值的左操作数".我不明白为什么会这样.我心目中的过程是程序先给x赋值34,然后再给b赋值x的值,即34.另一方面,我可以将语句用作 int b;整数 x;b=3 没有任何错误.我看了看我的书,但没有任何帮助.为什么我不能使
..
我刚刚开始使用 C++.我对赋值和取消引用运算符的返回类型有点困惑.我正在关注 C++ Primer 这本书.在各种场合,作者说赋值运算符的返回类型是对左手操作数类型的引用,但后来又说返回类型是左手操作数的类型.我已经提到了 C++11 Standard Sec.5.17,其中返回类型被描述为“左值引用左手操作数". 同样,我无法弄清楚取消引用是返回指向的对象还是对对象的引用. 这些陈
..
我今天第一次看到这种演员阵容,我很好奇为什么会这样.我认为以这种方式铸造会分配给临时成员,而不是班级成员.使用 VC2010. A 类{民众:一种() :m_value(1.f){((float)m_value) = 10.f;}const float m_value;}; 解决方案 它不应该工作.使用强制转换表示法到 float 的显式类型转换将是纯右值(第 5.4 节): 表达式
..
例如 int x[10];int i = 0;x = &i;//出现错误! 根据C - 参考手册,数组名不能是左值.因此,x 不能是左值.但是,数组名称不能是左值的原因是什么?比如第三行为什么会出现错误? 解决方案 您的参考不正确.数组可以是左值(但不能是可修改的左值),而“数组名称"(标识符)总是是左值. 举个例子: int x[10];int i = 0;x = &i;//
..
此处声明 术语可修改左值用于强调左值允许更改和检查指定的对象.以下对象类型是左值,但不可修改的左值: 数组类型 不完整的类型 const 限定类型 一个结构或联合类型,其成员之一被限定为 const 类型 因为这些左值是不可修改的,所以它们不能出现在赋值语句的左侧. 为什么数组类型的对象不可修改?写的对不对 int i = 5, a[10] = {0};[i] =
..
很长一段时间我都认为三元运算符总是返回一个右值.但令我惊讶的是它没有.在下面的代码中,我没有看到 foo 的返回值和三元运算符的返回值之间的区别. #include 整数 g = 20 ;int foo(){返回 g ;}int main(){int i= 2,j = 10 ;foo()=10 ;//不好((i
..