传统的C语言:左值可能放在等号左边,右值只能放在等号右边
    在 C++ 中,左值也不一定能放在等号左边;右值也可能放在等号左边

    1. #include <iostream>
    2. int main()
    3. {
    4. const int val = 7;
    5. //val = 9;
    6. int val1 = val;
    7. } //显然这里val不可以作为左值使用,也就是左值也不一定能放在等号左边
    1. #include <iostream>
    2. struct MyStruct{
    3. };
    4. int main()
    5. {
    6. MyStruct x = MyStruct{}; //这里MyStruct{}作为prvalue
    7. MyStruct{} = MyStruct{} ; //作为临时对象,并不能找到相应的内存
    8. }//没有报错

    所有的划分都是针对表达式的,不是针对对象或数值
    glvalue :标识一个对象、位或函数
    prvalue :用于初始化对象或作为操作数
    xvalue :表示其资源可以被重新使用
    image.png

    1. #include <iostream>
    2. #include <vector>
    3. void fun(std::vector<int>&& param){
    4. }
    5. int main()
    6. {
    7. std::vector<int> x;
    8. fun(std::move(x));
    9. }//lvalue --> xvalue

    左值与右值的转换
    左值转化为右值:

    1. #include <iostream>
    2. int main()
    3. {
    4. int val = 6;
    5. int val1 = val;
    6. }

    临时具体化(temporary intialization)


    decltype
    语法:

    1. decltype ( entity ) (1) (since C++11)
    2. decltype ( expression ) (2) (since C++11)

    用法(针对表达式):

    1. a) if the value category of expression is xvalue, then decltype yields T&&;
    2. b) if the value category of expression is lvalue, then decltype yields T&;
    3. c) if the value category of expression is prvalue, then decltype yields T.

    a)

    1. Source:
    2. #include <iostream>
    3. #include <utility>
    4. int main()
    5. {
    6. int x;
    7. decltype(std::move(x)) y = std::move(x);
    8. }
    9. Insight:
    10. #include <iostream>
    11. #include <utility>
    12. int main()
    13. {
    14. int x;
    15. int && y = std::move(x);
    16. }

    b)

    1. Source:
    2. #include <iostream>
    3. int main()
    4. {
    5. int x = 6;
    6. decltype((x)) y = x; // 注意这里不能写成 decltype((x)) y;因为此时已经转化为引用类型
    7. } // error: declaration of reference variable 'y' requires an initializer
    8. Insight:
    9. #include <iostream>
    10. int main()
    11. {
    12. int x = 6;
    13. int & y = x;
    14. }

    c)

    1. Source:
    2. #include <iostream>
    3. int main()
    4. {
    5. decltype(4) x; //显然4是prvalue
    6. }
    7. Insight:
    8. #include <iostream>
    9. int main()
    10. {
    11. int x;
    12. }