Value categories

Three primary categories

Each C++ expression (an operator with its operands, a literal, a variable name, etc.) is characterized by two independent properties: a type and a value category. Each expression has some non-reference type, and each expression belongs to exactly one of the three primary value categories.
每一个C++表达式有两个特征:类型和值分类

Primary categories

The primary value categories correspond to two properties of expression:

  • has identity- 标识符:it's possible to determine whether the expression refers to the same entity as another expression, such as by comparing addresses of the objects or the functions they identify(obtained directly or indirectly);
  • can be moved from:move constructor,move assignment operator,or another overload function that implements move semantics can bind to the expression.

move constructor:A move constructor of class T is a non-template
constructor whose first parameter is T&&, const T&&, volatile T&&, or const volatile T&&, and either there are no other parameters, or the rest of the parameters all have default values.

A move assignment operator of class T is a non-template non-static member function with the name operator= that takes exactly one parameter of type T&&, const T&&, volatile T&&, or const volatile T&&.

Expressions that:

  • have identity and cannot be moved from are called lvalue expressions;
  • have identity and can be moved from are called xvalue expressions;
  • do not have identity and can be moved from area called prvalue expression;(比如常量等)
  • do not have identity and cannot be moved from are not used.

lvalue

An lvalue("left value") expression is an expression that has identity and cannot be moved from.
The naming is historic and reflects the use of lvalue expressions as the left-hand operand of the assignment operator in the CPL programming language.
The following expressions are lvalue expression:

  • the name of a variable or a function in scope, regardless of type, such as std::cin or std::endl. Even if the variable's type is rvalue reference, the expression consisting of its name is an lvalue expression;
  • a = b, a += b, a %= b, and all other built-in assignment and compound assignment expressions
  • ++a and --a, the built-in pre-increment and pre-decrement expressions;
  • *p, the built-in indirection expression
  • a[n] and p[n], the built-in subscript expression
  • a.m, the member of object expression, except where m is a member enumerator or a non-static member function, or where a is an rvalue and m is a non-static data member of non-reference type;
  • p->m, the built-in member of pointer expression, except where m is a member enumerator or a non-static member function;
  • a.*mp, the pointer to member of object expression, where a is an lvalue and mp is a pointer to data member;
  • p->*mp, the built-in pointer to member of pointer expression, where mp is a pointer to data member;
  • a, b, the built-in comma expression, where b is an lvalue;
  • a ? b : c, the ternary conditional expression for some a, b, and c;
  • a string literal, such as "Hello, world!";
  • a cast expression to lvalue reference type, such asstatic_cast<int&>(x);

Properties:

  • Same as glvalue
  • Address of lvalue may be taken: &++i and std::endl are valid expressions.
  • A modifiable lvalue may be used as the left-hand operand of the built-in assignment and compound assignment operators.
  • An lvalue may be used to initialize an lvalue reference; this associates a new name with the object identified by the expression.

rvalue (until C++11) prvalue (since C++11)>

A prvalue ("pure rvalue") expression is an expression that does not have identity and can be moved from.
The following expressions are prvalue expression:

  • a literal (except for string literal), such as 42, true or nullptr;
  • a function call or an overloaded operator expression of non-reference return type, such as str.substr(1, 2), str1 + str2, or it++;
  • a++ and a--, the built-in post-increment and post-decrement expressions;
  • a + b, a % b, a & b, a << b, and all other built-in arithmetic expressions;
  • a && b, a || b, ~a, the built-in logical expressions;
  • a < b, a == b, a >= b, and all other built-in comparison expressions;
  • &a, the built-in address-of expression;
  • a.m, the member of object expression, where m is a member enumerator or a non-static member function[3], or where a is an rvalue and m is a non-static data member of non-reference type (until C++11);
  • p->m, the built-in member of pointer expression, where m is a member enumerator or a non-static member function
  • a.*mp, the pointer to member of object expression, where mp is a pointer to member function[3], or where a is an rvalue and mp is a pointer to data member (until C++11)
  • p->*mp, the built-in pointer to member of pointer expression, where mp is a pointer to member function
  • a, b, the built-in comma expression, where b is an rvalue;
  • a ? b : c, the ternary conditional expression for some a, b, and c
  • a cast expression to non-reference type, such as static_cast<double>(x), std::string{}, or (int)42

Properties:

  • Same as rvalue
  • A prvalue cannot be polymorphic: the dynamic type of the object it identifies is always the type of the expression.
  • A non-class prvalue cannot be cv-qualified.

xvalue

An xvalue -("expiring value") expression is an expression that has identity and can be moved from.
The following expressions are xvalue expressions:

  • a function call or an overloaded operator expression of rvalue reference to object return type, such as std::move(x);

Properties

  • Same as rvalue
  • Same as glvalue

Mixed categories

glvalue

A glvalue ("generalized lvalue") expression is an expression that is either an lvalue or an xvalue. It has identity. It may or may not be moved from.
Properties:

  • a glvalue may be implicitly converted to a prvalue with lvalue-to-rvalue,array-to-pointer,function-to-pointer implicit convention.
  • A glvalue may be polymorphic: the dynamic type of the object it identifies is not necessarily the static type of the expression.
  • A glvalue can have incomplete type, where permitted by the expression.

rvalue

An rvalue("rigthj value") expression is an expression that is either prvalue or an xvalue. It can be moved from. It may or may not have identity.
The naming is historic and reflects the use of rvalue expressions as the right-hand operand of the assignment operator in the CPL programming language.

Properties :

  • Address of an rvalue may not be taken: &int(), &i++, &42, and &std::move(x) are invalid.
  • An rvalue can't be used as the left-hand operand of the built-in assignment or compound assignment operators.
  • An rvalue may be used to initialize a const lvalue reference, in which case the lifetime of the object identified by the rvalue is extended until the scope of the reference ends.

Special categories

Pending member function call

The expressions a.mf and p->mf, where mf is a non-static member function, and the expressions a.*mfp and p->*mfp, where mfp is a pointer to member function, are classified as prvalue expressions, but they cannot be used to initialize references, as function arguments, or for any purpose at all, except as the left-hand argument of the function call operator, e.g. (p->*mfp)(args).

Void expressions

Function call expressions returning void, cast expressions to void, and throw-expressions are classified as prvalue expressions, but they cannot be used to initialize references or as function arguments.

Bit fields

An expression that designates a bit field (e.g. a.m, where a is an lvalue of type struct A { int m: 3; }) is an lvalue expression:
it may be used as the left-hand operand of the assignment operator, but its address cannot be taken and a non-const lvalue reference cannot be bound to it.
A const lvalue reference can be initialized from a bit-field lvalue, but a temporary copy of the bit-field will be made: it won't bind to the bit field directly.(不会直接绑定到原来值上的,而是一个临时的副本)

Value Categories的更多相关文章

  1. iOS开发中可能有用的那些分类们Categories

    Categories是给你得不到源码的classes增加功能的一种方法. UIImageView+FaceAwareFill 这个类别使用了Aspect Fill内容模式,可以自动根据图像内容进行调整 ...

  2. Questions that are independent of programming language. These questions are typically more abstract than other categories.

    Questions that are independent of programming language.  These questions are typically more abstract ...

  3. Objective-C categories in static library

    ASK: Can you guide me how to properly link static library to iphone project. I use staic library pro ...

  4. instance variables may not be placed in categories

    Avoid Properties in Categories Objective-C分类中是不允许增加成员变量的(Instance variables may not be placed in cat ...

  5. FusionCharts封装-dataset和categories

    Chart.java: /** * @Title:Chart.java * @Package:com.fusionchart.model * @Description:FusionCharts 封装d ...

  6. opencart3调用三级菜单level 3 sub categories

    Opencart 3的menu菜单默认只调用一级和二级菜单,但很多电商网站类目复杂,三级菜单一般都是需要的,甚至更深,那么如何调用三级菜单level 3 sub categories呢?ytkah有一 ...

  7. Categories  VS Extensions (分类 vs 扩展)

    转载翻译自:http://rypress.com/tutorials/objective-c/categories 一.Categories(分类)      Categories是一个把单个类定义分 ...

  8. 使用开源库 Objective-C RegEx Categories 处理正则表达式

    Objective-C RegEx Categories https://github.com/bendytree/Objective-C-RegEx-Categories 使用说明:将 RegExC ...

  9. Capterra Software Categories

    https://www.capterra.com/categories this software categories is valuable.

随机推荐

  1. django学习之Model(五)MakingQuery

    接着上篇. 10-一次更新多个对象 有时想要对QuerySet中的所有对象的某一个field来设定一个值,这时候可以像下边这样用update(): # Update all the headlines ...

  2. JAVA和.NET互调用

    通过接口实现JAVA和.NET互调用-JNInterface 使用C#编程多年,也十分感激微软在语言架构.语法糖.编辑器等方面给自己带来的便利.但因为最近工作中有接触到JAVA,渐渐地发现的确像大家说 ...

  3. 注册表与盘符(转victor888文章 )

    转自: http://blog.csdn.net/loulou_ff/article/details/3769479     写点东西,把这阶段的研究内容记录下来,同时也给研究相关内容的同志提供参考, ...

  4. SPOJ 1812 Longest Common Substring II(后缀自动机)

    [题目链接] http://www.spoj.com/problems/LCS2/ [题目大意] 求n个串的最长公共子串 [题解] 对一个串建立后缀自动机,剩余的串在上面跑,保存匹配每个状态的最小值, ...

  5. Android面试题06

    51. 一条最长的短信息约占多少byte? 中文70(包括标点),英文160,160个字节 这个说法不准确, 要跟手机制式运营商等信息有关. 做实验,看源码 ArrayList<String&g ...

  6. iOS中Block介绍(一)基础

    ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...

  7. xml 充当简易数据库

    后台: 写入节点 public static void Update(string path, string node, string attribute, string value) { try { ...

  8. 笔记-Nodejs中的核心API之Events

    最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态.比如Node中的模块,平时练习就接触到那么几个,其他的 ...

  9. [学习笔记]今天开始学HTML5!

    1,href和src的区别:href有“连接,引用”之意,指两者的连接关系,如<a href=""></a>,<link href="**. ...

  10. fullPage.js插件用法(转发)

    fullPage.js主要功能有: 支持鼠标滚动 支持前进后退和键盘控制 多个回调函数 支持手机.平板触摸事件 支持 CSS3 动画 支持窗口缩放 窗口缩放时自动调整 可设置滚动宽度.背景颜色.滚动速 ...