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();
}