当 auto 与结尾返回类型结合使用时,它对于 decltype 表达式生成的任何内容都只用作占位符,本身不执行类型推导。
返回类型中的类型推导 (C++14)
在 C++14 中,可以使用 auto 指示编译器从函数体推断返回类型,而不必提供结尾返回类型。请注意,auto 始终推导为按值返回。使用 auto&& 可指示编译器推导引用。
在此示例中,auto 会推导为 lhs 和 rhs 之和的非常量值副本。
template<typename Lhs, typename Rhs>
auto Add2(const Lhs& lhs, const Rhs& rhs)
{
return lhs + rhs; //returns a non-const object by value
}
请注意,auto 不会保留它推导的类型的常量性。对于返回值需要保留其参数的常量性或引用性的转发函数,可以使用 decltype(auto) 关键字,该关键字使用 decltype 类型推断规则并保留所有类型信息。 decltype(auto) 可以用作左侧的普通返回值,或结尾返回值。
下面的示例(基于来自 N3493 的代码)演示的 decltype(auto) 用于采用在模板实例化之前未知的返回类型实现函数参数的完美转发。
template<typename F, typename Tuple = tuple<T...>, int... I>
decltype(auto) apply_(F&& f, Tuple&& args, index_sequence<I...>)
{
return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(args))...);
}
template<typename F, typename Tuple = tuple<T...>,
typename Indices = make_index_sequence<tuple_size<Tuple>::value >>
decltype( auto)
apply(F&& f, Tuple&& args)
{
return apply_(std::forward<F>(f), std::forward<Tuple>(args), Indices());
}
}
函数局部变量
在函数主体内声明的变量称为局部变量。非静态局部变量仅在函数体中可见,如果它们在堆栈上声明,则会在函数退出时超出范围。构造局部变量并通过值返回它时,编译器通常可以执行返回值优化以避免不必要的复制操作。如果通过引用返回局部变量,则编译器会发出警告,因为调用方为使用该引用而进行的任何尝试会在局部变量已销毁之后进行。
局部静态对象将在 atexit 指定的终止期间销毁。如果某个静态对象由于程序的控制流跳过了其声明而未构造,则不会尝试销毁该对象。
静态局部变量
在 C++ 中,局部变量可以声明为静态。变量仅在函数体中可见,但是对于函数的所有实例,存在变量的单个副本。
函数指针
C++ 通过与 C 语言相同的方式支持函数指针。但是更加类型安全的替代方法通常是使用函数对象。
建议使用 typedef 声明函数指针类型的别名(如果声明返回函数指针类型的函数)。例如










