右值引用(&&
)
右值引用(&&
)允许我们定义接受临时对象或移动语义的函数。
cpp
void foo(int&& x); // 右值引用参数
默认参数
允许在函数声明中指定参数的默认值。
cpp
void bar(int x, double y = 3.14); // 带有默认参数的函数声明
noexcept关键字
指示函数是否可能引发异常。
cpp
void baz() noexcept; // 不会引发异常的函数声明
constexpr函数
允许在函数声明中指定constexpr以表明函数可以在编译时求值。
cpp
constexpr int add(int x, int y); // constexpr函数声明
模板函数
引入了更灵活的模板函数声明,支持更多的模板参数和模板参数的默认值。
cpp
template<typename T = int>
void qux(T x); // 带有模板参数的函数声明
尾置返回类型 (Trailing Return Type)
C++11 引入了尾置返回类型的概念,这允许我们在函数参数列表之后声明返回类型。这主要用于那些返回类型依赖于模板参数的函数。
cpp
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u);
auto 类型推导
C++11 中的 auto
关键字允许编译器自动推导变量的类型。在函数声明中,auto
可以与尾置返回类型一起使用,以自动推导函数的返回类型。
cpp
auto max(int a, int b) -> int {
return (a > b) ? a : b;
}
函数模板参数推导
从 C++17 开始,我们可以省略函数模板的参数类型,让编译器自动推导。这被称为函数模板参数推导或 CTAD (Class Template Argument Deduction)。
cpp
template<typename T>
T add(T t1, T t2) {
return t1 + t2;
}
// 使用时,不需要显式指定模板参数类型
auto result = add(3, 4); // result 的类型为 int
结构化绑定 (Structured Binding)
虽然这不是直接关于函数声明的,但结构化绑定允许我们以更简洁的方式从函数返回多个值。这在 C++17 中被引入。
cpp
std::pair<int, int> getTwoNumbers() {
return {5, 10};
}
auto [a, b] = getTwoNumbers(); // a = 5, b = 10
Lambda 表达式
虽然 Lambda 表达式不是传统意义上的函数声明,但它们提供了一种在代码中定义匿名函数的方式。Lambda 表达式在 C++11 中被引入,并在此后的标准中得到了改进。
默认参数和函数重载
虽然这些特性在较早的 C++ 标准中就已经存在,但它们仍然是函数声明的重要组成部分。默认参数允许我们为函数参数提供默认值,而函数重载允许我们为同一函数名定义多个版本,每个版本接受不同类型的参数。这些特性增加了代码的灵活性和可读性。