标签: lvalue

表达式必须是可修改的L值

我在这里 char text[60];

然后我做了一个if:

if(number == 2)
  text = "awesome";
else
  text = "you fail";
Run Code Online (Sandbox Code Playgroud)

它总是说表达式必须是可修改的L值.

c char variable-assignment lvalue

29
推荐指数
1
解决办法
9万
查看次数

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

我刚刚发现了最令人困惑的错误,我不明白为什么编译器没有为我标记它.如果我写下面的内容:

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++ string substring lvalue

29
推荐指数
3
解决办法
2429
查看次数

为什么预增量运算符在C中给出rvalue?

在C++中,预增量运算符给出左值,因为返回了递增的对象本身,而不是副本.但在C中,它给出了右值.为什么?

c c++ rvalue lvalue

28
推荐指数
1
解决办法
1949
查看次数

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

我试图理解为什么有人会编写一个带有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)

c++ rvalue lvalue overload-resolution c++11

27
推荐指数
1
解决办法
3625
查看次数

rvalue结构的成员是右值还是左值?

返回结构的函数调用是一个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是左值还是左值的说法.
那么,它是什么?

c++ structure rvalue lvalue

26
推荐指数
1
解决办法
2567
查看次数

为什么文字和临时变量不是左值?

我读过的lvalues是"具有已定义存储位置的内容".

而且文字和临时变量也不是左值,但没有给出这个陈述的理由.

是因为文字和临时变量没有定义存储位置?如果是的话,那么如果不在记忆中它们会在哪里居住?

我想在"定义的存储位置"中"定义"有一些意义,如果有(或没有)请告诉我.

c++ rvalue lvalue c++11

24
推荐指数
4
解决办法
1940
查看次数

左值作为赋值的左操作数

我为什么要来

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)

谢谢!

c strcmp lvalue

23
推荐指数
2
解决办法
33万
查看次数

右值参考被视为左值?

我发布了这个答案: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++ rvalue lvalue rvalue-reference c++11

23
推荐指数
2
解决办法
3864
查看次数

什么是赋值运算符的返回类型?

我刚刚开始使用C++.我对赋值和解引用运算符的返回类型有点困惑.我正在阅读C++ Primer一书.在不同的场合,作者说,赋值运算符的返回类型是对左手操作数的类型的引用,但后来,他说返回类型是左手操作数的类型.我已经提到了C++ 11标准版.5.17,其中返回类型被描述为"左手操作数的左值".

同样,我无法弄清楚dereference是返回指向对象还是返回对象的引用.

这些陈述是否相同?如果是这样,那怎么样?任何解释将不胜感激.

c++ reference lvalue dereference assignment-operator

22
推荐指数
2
解决办法
3万
查看次数

使用`void*`将右值引用左值引用到左值

在尝试理解右值引用的工作原理时,我最终得到了这段代码:

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)

c++ lvalue rvalue-reference language-lawyer c++11

21
推荐指数
2
解决办法
1055
查看次数