decltype 运算符
decltype 运算符
decltype(变量)
decltype(表达式)
当 decltype 用于变量以及类的成员变量时,能够获得变狼的类型,同时还能得到这个类的引用类型以及 CV 限定符(const 限定符,volatile 限定符)
由于 b的类型是 a 的引用,所以 c 的类型也是 a 的引用
decltype 也可以获得类或者类对象成员变量的类型
最简单的方式:到编辑器中查看
auto 和 decltype 区别
const int& c = a;
// 变量 d 是使用自动推导 anto 定义的,它相当于
int d = b;
可以发现:auto 只能通过初始化表达式,推导出基本类型,而不能获得引用类型以及 cv 限定符,所以需要手动添加。
const auto& e = b;
decltype 对于表达式的推导与单纯的变量类型推导方法 非常不同
对于函数来说,正好是函数的返回类型
定义类模板 value_category,以及它的左值引用和右值引用的特化版本(唯一区别就是静态成员 value 值不同)
template<typename T>
struct value_category {
static constexpr auto value = "prvalue";
};
template<typename T>
struct value_category<T&> {
static constexpr auto value = "lvalue";
};
template<typename T>
struct value_category<T&&> {
static constexpr auto value = "xvalue";
};
#define VALUE_CATEGORY(expr) value_category<decltype((expr))>::value
#define CAT(a) std::cout << "Category of " << #a << ":" << VALUE_CATEGORY(a) << std::endl
struct S
{
float m;
S& operator+(int a){return *this;}
};
S func(int a){
return S{};
}
int main()
{
int i = 1;
CAT(i);
CAT(i++);
CAT(S{});
S s;
S&& b = static_cast<S&&>(s);
CAT(b);
CAT(static_cast<S&&>(s));
CAT(s+1);
CAT(S{});
CAT(S{1.5}.m);
CAT(func);
CAT(func(1));
return 0;
}
1