简单的例子
const int i = 0; // decltype(i): const int
bool f(const Widget& w); // decltype(w): const Widget&
struct Point {
int x, y; // decltype(Point::x): int, decltype(Point::y): int
};
Widget w; // decltype(w): Widget
if (f(w)) ... // decltype(f(w)) is bool
template <typename T> // std::vector 的简化版本
class vector {
public:
...
T& operator[](std::size_t index);
...
};
vector<int> v; // decltype(v): vector<int>
if (v[0] == 0) ... // decltype(v[0]): int&
函数的返回值,依赖于函数的参数
c++11
template <typename Container, typename Index>
auto authAndAccess(Container&& c, Index i)
-> decltype(std::forward<Container>(c)[i]) {
authenticateUser();
return std::forward<Container>(c)[i];
}
c++14
template <typename Container, typename Index>
auto authAndAccess(Container&& c, Index i) {
authenticateUser();
return std::forward<Container>(c)[i];
}
注意,这里的auto遵循template的类型推断,具体见理解auto类型推断
所以,c++14的版本与c++11版本返回值类型有所区别!
为了保证c++14版本返回的正确性
template <typename Container, typename Index>
decltype(auto) authAndAccess(Container&& c, Index i) {
authenticateUser();
return c[i];
}
decltype(auto)
是c++14的新特性,除了用于函数的返回值,还能用于其他地方
Widget w;
const Widget& cw = w;
auto myWidget1 = cw; // myWidget1: Widget
decltype(auto) myWidget2 = cw; // myWidget2: const Widget&
使用在左值表达式上
使用在左值表达式上时,总是返回左值引用
int x = 0; // decltype(x): int, decltype((x)): int&
decltype(auto) f1() {
int x = 0;
return x; // decltype(x): int
}
decltype(auto) f2() {
int x = 0;
return (x); // decltype((x)): int&
}
牢记
decltype
一般返回的都是你期待的类型- 在左值表达式
T
上,decltype
总是返回T&
- c++14支持
decltype(auto)
表现与auto
类似,但是应用decltype
的规则