我在这里 char text[60];
然后我做了一个if:
if(number == 2)
text = "awesome";
else
text = "you fail";
Run Code Online (Sandbox Code Playgroud)
它总是说表达式必须是可修改的L值.
我刚刚发现了最令人困惑的错误,我不明白为什么编译器没有为我标记它.如果我写下面的内容:
string s = "abcdefghijkl";
cout << s << endl;
s.substr(2,3) = "foo";
s.substr(8,1) = '.';
s.substr(9,1) = 4;
cout << s << endl;
Run Code Online (Sandbox Code Playgroud)
编译器对此没有任何问题,并且赋值语句似乎根据打印出的内容没有任何效果.相反,
s.front() = 'x';
Run Code Online (Sandbox Code Playgroud)
具有我期望的效果(因为front返回对字符的引用)改变底层字符串,和
s.length() = 4;
Run Code Online (Sandbox Code Playgroud)
也有产生编译器错误的预期效果,抱怨你不能分配给不是左值的东西,因为length返回一个整数.(好吧,size_t无论如何.)
那么......为什么编译器不会抱怨分配给substr调用的结果呢?它返回一个字符串值,而不是引用,所以它不应该是可赋值的,对吧?但我在g++(6.2.1)和clang++(3.9.0)中尝试了这个,所以它似乎不是一个bug,它似乎也不敏感C++版本(试过03,11,14) ).
在C++中,预增量运算符给出左值,因为返回了递增的对象本身,而不是副本.但在C中,它给出了右值.为什么?
我试图理解为什么有人会编写一个带有const右值引用的函数.
在下面的代码示例中,const rvalue引用函数的用途是什么(返回"3").为什么重载决策首选const Rvalue高于const LValue引用函数(返回"2").
#include <string>
#include <vector>
#include <iostream>
std::vector<std::string> createVector() { return std::vector<std::string>(); }
//takes movable rvalue
void func(std::vector<std::string> &&p) { std::cout << "1"; }
//takes const lvalue
void func(const std::vector<std::string> &p) { std::cout << "2"; }
//takes const rvalue???
//what is the point of const rvalue? if const I assume it is not movable?
void func(const std::vector<std::string> &&p) { std::cout << "3"; }
int main()
{
func(createVector());
return 0;
}
Run Code Online (Sandbox Code Playgroud) 返回结构的函数调用是一个rvalue表达式,但它的成员呢?
这段代码适用于我的g ++编译器,但是gcc给出了一个错误,说"左值作为赋值的左操作数":
struct A
{
int v;
};
struct A fun()
{
struct A tmp;
return tmp;
}
int main()
{
fun().v = 1;
}
Run Code Online (Sandbox Code Playgroud)
gcc视为fun().v右值,我能理解.
但是g ++并不认为赋值表达式是错误的.这是否意味着fun1().v是C++中的左值?
现在的问题是,我搜索了C++ 98/03标准,没有找到关于fun().v是左值还是左值的说法.
那么,它是什么?
我读过的lvalues是"具有已定义存储位置的内容".
而且文字和临时变量也不是左值,但没有给出这个陈述的理由.
是因为文字和临时变量没有定义存储位置?如果是的话,那么如果不在记忆中它们会在哪里居住?
我想在"定义的存储位置"中"定义"有一些意义,如果有(或没有)请告诉我.
我为什么要来
lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)
用单个字符串比较?我该如何解决这个问题C?
if (strcmp("hello", "hello") = 0)
Run Code Online (Sandbox Code Playgroud)
谢谢!
我发布了这个答案:https://stackoverflow.com/a/28459180/2642059其中包含以下代码:
void foo(string&& bar){
string* temp = &bar;
cout << *temp << " @:" << temp << endl;
}
Run Code Online (Sandbox Code Playgroud)
是bar左值还是左值?
我问,因为我显然不能取rvalue的地址,但我可以在这里完成rvalue引用的地址.
如果你可以对左值参考执行任何操作,你可以在左值参考上区分用"&&"而不仅仅是"&"来区分两者?
我刚刚开始使用C++.我对赋值和解引用运算符的返回类型有点困惑.我正在阅读C++ Primer一书.在不同的场合,作者说,赋值运算符的返回类型是对左手操作数的类型的引用,但后来,他说返回类型是左手操作数的类型.我已经提到了C++ 11标准版.5.17,其中返回类型被描述为"左手操作数的左值".
同样,我无法弄清楚dereference是返回指向对象还是返回对象的引用.
这些陈述是否相同?如果是这样,那怎么样?任何解释将不胜感激.
在尝试理解右值引用的工作原理时,我最终得到了这段代码:
int* iptr = nullptr;
int*&& irr = iptr;
Run Code Online (Sandbox Code Playgroud)
编译上面的代码会出现以下错误:
错误:对'int*'类型的rvalue引用不能绑定到'int*'类型的左值
我理解这是正确的,但为什么下面的代码,我使用a void*而不是int*编译绑定,编译没有任何问题?运行时行为是正确的还是我应该期望未定义的行为?
int* iptr = nullptr;
void*&& irr = iptr;
Run Code Online (Sandbox Code Playgroud)