04 std::decltype

decltype

decltype ( 实体 )
decltype ( 表达式 )
若实参是其他类型为 T 的任何表达式,且
a) 若 表达式 的值类别为亡值,则 decltype 产生 T&&;
b) 若 表达式 的值类别为左值,则 decltype 产生 T&;
c) 若 表达式 的值类别为纯右值,则 decltype 产生 T。

int a;
double d;
float f;

decltype(a) aa;
cout << typeid(aa).name() << endl; //int
decltype(d) dd;
cout << typeid(dd).name() << endl;//double
decltype(f) ff;
cout << typeid(ff).name() << endl;//float
1.0 返回类型依赖于模板形参
template<typename T, typename U>
// 返回类型依赖于模板形参
auto add(T t, U u) -> decltype(t + u){
    return t+u;
}
1.1 可以用于抽象基类
struct A {
    virtual int value() = 0;
};

decltype(std::declval<A>().value()) a;  // => int a
cout << typeid(a).name() << endl;
1.2 标准库中有些类型都是通过decltype来定义的
typedef decltype(nullptr) nullptr_t;
typedef decltype(sizeof(0)) size_t;
1.3 取它迭代器的首位置
typename T::iterator it;
typename T::const_iterator it;
decltype  (T.begin() ) it;

void func(T t)
{
    it = t.begin();
}
posted @ 2019-06-24 14:53  osbreak  阅读(1581)  评论(0编辑  收藏  举报