string& f();
auto x = f(); // тип x - string, ссылка потерялась, строка скопировалась
auto g() { return f(); } // возвращается string
// аналог в С++11: auto g() -> decay<decltype(f())>::type;
decltype(auto) y = f(); // тип y - string&
// аналог в С++11: decltype(f()) y = f();
decltype(auto) h() { return f(); } // возвращается string&
// аналог в С++11: auto h() -> decltype(f());
auto maton = 112; // maton получает тип int
auto pt = &maton; // pt получает тип int *
double fm(double, int);
auto pf = fm; // pf получает тип double (*) (double, int)
auto 关键字还可以简化模板声明。例如,如果 il 是 类型的对象std::initializer_list<double>,则以下代码
for (std::initializer_list<double>::iterator p = il.begin();
p !=il.end(); p++)
可以用这个代替:
for (auto p = il.begin(); p != il.end(); p++)
解密类型
decltype 关键字创建表达式指定类型的变量。下面的语句表示“将 y 分配给与 x 相同的类型”,其中 x 是一个表达式:
decltype(х) у;
这里还有几个例子:
double x;
int n;
decltype(x*n) q; // q получает тот же тип, что и х*n, т.е. double
decltype(&x) pd; // pd получает тот же тип, что и &х, т.е. double *
这在模板定义中特别有用,在模板定义中,在创建特定实例之前可能无法定义类型:
template<typename Т, typename U)
void ef (T t, U u)
{
decltype(T*U) tu;
...
}
尾返回类型
C++11 有一个用于声明函数的新语法,其中返回类型在函数名称和参数列表之后而不是在它们之前指定:
double f1(double, int); // традиционный синтаксис
auto f2(double, int) -> double; // новый синтаксис, // возвращаемым типом является double
新语法可能看起来不如传统的函数声明可读,但它使得使用decltype模板函数指定返回类型成为可能:
template<typename Т, typename U)
auto eff (T t, U u) -> decltype (T*U)
{
}
auto它是一种“腐烂”的表达类型,即 链接丢失并发生复制:decltype(expr)是表达式的实际类型,没有收缩。decltype(auto)是一种方便的语法,允许您不在其中编写表达式decltype。换句话说, 这
decltype(auto)是一个方便的替换decltype(expr),这是一个简短的语法。autostd::decay<decltype(auto)>::type汽车
在 C++11 中,auto 关键字已被剥离其作为存储类说明符的原始含义,现在用于在给出显式初始化程序时实现自动类型推断。编译器将变量的类型设置为初始化值的类型:
auto 关键字还可以简化模板声明。例如,如果 il 是 类型的对象
std::initializer_list<double>,则以下代码可以用这个代替:
解密类型
decltype 关键字创建表达式指定类型的变量。下面的语句表示“将 y 分配给与 x 相同的类型”,其中 x 是一个表达式:
这里还有几个例子:
这在模板定义中特别有用,在模板定义中,在创建特定实例之前可能无法定义类型:
尾返回类型
C++11 有一个用于声明函数的新语法,其中返回类型在函数名称和参数列表之后而不是在它们之前指定:
新语法可能看起来不如传统的函数声明可读,但它使得使用
decltype模板函数指定返回类型成为可能:这里说明的问题是,当编译器读取eff的参数列表时,T和U不在范围内,所以任何使用
decltype都必须在这个参数列表之后。新语法使这成为可能。