decltype使用

在使用template模板时,或类型推导时,经常会用到decltype说明符。

那么decltype具有哪些作用呢,如下:

1)检查实体的声明类型----【见例子--Lambda】;

2)表达式的类型或值得类别。

注意

如果在使用中对象带有括号,就作为左值表达式【见例子--结构体Ta】。


例子】:

#include // 主要头文件#include // 结构体struct Ta { double x; };const Ta* pTa;// 注意:加不加括号 的结果decltype(pTa->x) y; // y 类型是 double(其声明类型)// 对象加括号decltype((pTa->x)) z = y; // z 的类型是 const double&(左值表达式)// 模板函数, 类型推导templateauto mul(M t, U u) -> decltype(t * u) // 返回类型依赖于模板形参{     return t*u;}int main(){// 类型判断(带括号), 需C++17std::cout << "y 和 z 的类型"              << (std::is_same_v ? "相同" : "不同")              << std::endl; int i = 1;decltype(i) j = i * 2; // int类型// 类型判断, 需C++17std::cout << "i 和 j 的类型"              << (std::is_same_v ? "相同" : "不同")              << std::endl;std::cout << "i 的类型name: " < int{return a + b;};decltype(f) g = f; // 类型判断std::cout << "f 和 g 的类型"              << (std::is_same_v ? "相同" : "不同")              << std::endl;std::cout<<" decltype f name: " << typeid(decltype(f)).name() << std::endl;std::cout<<" decltype g name: " << typeid(decltype(g)).name() << std::endl;std::cout<<" decltype f(3,2) name: " << typeid(decltype(f(3,2))).name() << std::endl;}

结果

y 和 z 的类型不同

i 和 j 的类型相同

i 的类型name: i,j 的类型name: i

decltype void() name: v

f 和 g 的类型相同

decltype f name: Z4mainEUliiE_

decltype g name: Z4mainEUliiE_

decltype f(3,2) name: i

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章