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

posted @ 2025-04-06 11:40  爱新觉罗LQ  阅读(34)  评论(0)    收藏  举报