成员访问操作符: . 与 ->
    -> 等价于 (*).

    1. #include <iostream>
    2. struct str{
    3. int x;
    4. };
    5. int main()
    6. {
    7. str str1;
    8. str *ptr = &str1;
    9. *ptr.x; // 错误,因为.的运算优先级高于*,从而ptr.x先进行运算,这显然是错误的
    10. (*ptr).x; // 正确
    11. ptr->x; // 正确
    12. }

    . 的左操作数是左值(或右值),返回左值(或右值 xvalue )

    1. #include <iostream>
    2. struct str{
    3. int x;
    4. };
    5. int main()
    6. {
    7. str str1;
    8. decltype((str1.x)) y = str1.x; // 这里加上括号,使实体转化为表达式,如果str1是左值,则y的类型是int &
    9. }

    Insight:

    1. #include <iostream>
    2. struct str
    3. {
    4. int x;
    5. // inline str() noexcept = default;
    6. };
    7. int main()
    8. {
    9. str str1 = str();
    10. int & y = str1.x;
    11. }
    1. #include <iostream>
    2. struct str{
    3. int x;
    4. };
    5. int main()
    6. {
    7. str str1;
    8. decltype((str().x)) y = std::move(str1.x);
    9. }

    Insight:

    1. #include <iostream>
    2. struct str
    3. {
    4. int x;
    5. // inline str() noexcept = default;
    6. };
    7. int main()
    8. {
    9. str str1 = str();
    10. int && y = std::move(str1.x); // 构造右值引用
    11. }

    之前讨论了decltype(expression)的用法,除此之外,还有decltype(entity)的用法

    -> 的左操作数指针,返回左值

    1. #include <iostream>
    2. struct str{
    3. int x;
    4. };
    5. int main()
    6. {
    7. str str1;
    8. str* ptr = &str1;
    9. decltype((ptr->x)) y = str1.x;
    10. }

    Insight:

    1. #include <iostream>
    2. struct str
    3. {
    4. int x;
    5. // inline str() noexcept = default;
    6. };
    7. int main()
    8. {
    9. str str1 = str();
    10. str * ptr = &str1;
    11. int & y = str1.x;
    12. }

    条件操作符
    唯一的三元操作符
    接收一个可转换为 bool 的表达式与两个类型相同的表达式,只有一个表达式会被求值
    如果表达式均是左值,那么就返回左值,否则返回右值
    右结合

    逗号操作符
    确保操作数会被从左向右求值
    求值结果为右操作数
    左结合

    sizeof 操作符
    操作数可以是一个类型或一个表达式
    并不会实际求值,而是返回相应的尺寸

    其它操作符
    域解析操作符 : :
    函数调用操作符 ()
    索引操作符 []
    抛出异常操作符 throw