相关疑难解决方法(0)

什么是右值,左值,x值,glvalues和prvalues?

在C++ 03中,表达式是rvaluelvalue.

在C++ 11中,表达式可以是:

  1. 右值
  2. 左值
  3. x值
  4. glvalue
  5. prvalue

两类已成为五大类.

  • 这些新的表达类别是什么?
  • 这些新类别如何与现有的左值和左值类别相关联?
  • C++ 0x中的右值和左值类别是否与它们在C++ 03中的相同?
  • 为什么需要这些新类别?是WG21神只是想迷惑我们凡人?

c++ expression c++-faq c++11

1291
推荐指数
13
解决办法
17万
查看次数

什么表达式创建xvalues?

我正在尝试理解C++ 11的概念.

我所说的标准草案:

xvalue("eXpiring"值)也指对象,通常接近其生命周期的末尾(例如,可以移动其资源).xvalue是涉及rvalue引用的某些表达式的结果(8.3.2).[示例:调用返回类型为右值引用的函数的结果是xvalue. - 末端的例子]

那么,产生xvalues的"某种表达式" 到底什么?规范的这一部分没有详细说明这些表达式的列表.

我理解左值和右值(至少我认为,我理解).

c++ language-lawyer xvalue c++11

25
推荐指数
2
解决办法
4091
查看次数

右值参考被视为左值?

我发布了这个答案: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
查看次数

关于如何识别Rvalue或Lvalue引用以及if-it-has-a-name规则

我正在阅读托马斯·贝克尔关于右值参考及其使用的文章.在那里,他定义了他称之为if-it-a-name规则:

声明为右值引用的事物可以是左值或右值.区别标准是:如果它有一个名字,那么它就是一个左值.否则,它是一个右值.

这对我来说听起来很合理.它还清楚地标识了右值参考的右值.

我的问题是:

  1. 你同意这个规则吗?如果没有,您能举例说明违反此规则吗?
  2. 如果没有违反此规则.我们可以使用此规则来定义表达式的rvalueness/lvaluness吗?

c++ rvalue lvalue rvalue-reference c++11

15
推荐指数
3
解决办法
2991
查看次数

在C++中,哪些类别(左值,右值,右值等)可以生成类类型临时的表达式?

这是一些示例代码:

#include <iostream>

class Foo
{
public:
  explicit Foo(int x) : data(x) {};

  Foo& operator++()
  {
    data += 1;
    return *this;
  }

  void *get_addr()
  {
    return (void*)this;
  }

  friend Foo operator + (const Foo& lhs, const Foo& rhs);
  friend std::ostream& operator << (std::ostream& os, const Foo& f);

private:
  int data;
};

std::ostream& operator << (std::ostream& os, const Foo& f)
{
  return (os << f.data);
}

Foo operator + (const Foo& lhs, const Foo& rhs)
{
  return Foo(lhs.data + rhs.data);
} …
Run Code Online (Sandbox Code Playgroud)

c++ rvalue rvalue-reference xvalue c++11

9
推荐指数
2
解决办法
1313
查看次数

为什么命名右值引用是左值表达式?

我知道命名引用是左值:

int x = 1;
int& ref1 = x;
int&& ref2 = std::move(x);
Run Code Online (Sandbox Code Playgroud)

我读过解释——那是因为我们可以获取那些ref1和的地址ref2

但是当我们获取引用的地址时,我们实际上获取了被引用对象的地址,不是吗?所以这个解释似乎不太正确。

那么为什么命名引用是左值呢?

c++ rvalue-reference value-categories

7
推荐指数
1
解决办法
1378
查看次数