成员访问操作符: . 与 ->
-> 等价于 (*).
#include <iostream>
struct str{
int x;
};
int main()
{
str str1;
str *ptr = &str1;
*ptr.x; // 错误,因为.的运算优先级高于*,从而ptr.x先进行运算,这显然是错误的
(*ptr).x; // 正确
ptr->x; // 正确
}
. 的左操作数是左值(或右值),返回左值(或右值 xvalue )
#include <iostream>
struct str{
int x;
};
int main()
{
str str1;
decltype((str1.x)) y = str1.x; // 这里加上括号,使实体转化为表达式,如果str1是左值,则y的类型是int &
}
Insight:
#include <iostream>
struct str
{
int x;
// inline str() noexcept = default;
};
int main()
{
str str1 = str();
int & y = str1.x;
}
#include <iostream>
struct str{
int x;
};
int main()
{
str str1;
decltype((str().x)) y = std::move(str1.x);
}
Insight:
#include <iostream>
struct str
{
int x;
// inline str() noexcept = default;
};
int main()
{
str str1 = str();
int && y = std::move(str1.x); // 构造右值引用
}
之前讨论了decltype(expression)的用法,除此之外,还有decltype(entity)的用法
-> 的左操作数指针,返回左值
#include <iostream>
struct str{
int x;
};
int main()
{
str str1;
str* ptr = &str1;
decltype((ptr->x)) y = str1.x;
}
Insight:
#include <iostream>
struct str
{
int x;
// inline str() noexcept = default;
};
int main()
{
str str1 = str();
str * ptr = &str1;
int & y = str1.x;
}
条件操作符
唯一的三元操作符
接收一个可转换为 bool 的表达式与两个类型相同的表达式,只有一个表达式会被求值
如果表达式均是左值,那么就返回左值,否则返回右值
右结合
逗号操作符
确保操作数会被从左向右求值
求值结果为右操作数
左结合
sizeof 操作符
操作数可以是一个类型或一个表达式
并不会实际求值,而是返回相应的尺寸
其它操作符
域解析操作符 : :
函数调用操作符 ()
索引操作符 []
抛出异常操作符 throw