右值引用(&&)

右值引用(&&)允许我们定义接受临时对象或移动语义的函数。

void foo(int&& x); // 右值引用参数

默认参数

允许在函数声明中指定参数的默认值。

void bar(int x, double y = 3.14); // 带有默认参数的函数声明

noexcept关键字

指示函数是否可能引发异常。

void baz() noexcept; // 不会引发异常的函数声明

constexpr函数

允许在函数声明中指定constexpr以表明函数可以在编译时求值。

constexpr int add(int x, int y); // constexpr函数声明

模板函数

引入了更灵活的模板函数声明,支持更多的模板参数和模板参数的默认值。

template<typename T = int>
void qux(T x); // 带有模板参数的函数声明

尾置返回类型 (Trailing Return Type)

C++11 引入了尾置返回类型的概念,这允许我们在函数参数列表之后声明返回类型。这主要用于那些返回类型依赖于模板参数的函数。

template<typename T, typename U>  
auto add(T t, U u) -> decltype(t + u);

auto 类型推导

C++11 中的 auto 关键字允许编译器自动推导变量的类型。在函数声明中,auto 可以与尾置返回类型一起使用,以自动推导函数的返回类型。

auto max(int a, int b) -> int {  
    return (a > b) ? a : b;  
}

函数模板参数推导

从 C++17 开始,我们可以省略函数模板的参数类型,让编译器自动推导。这被称为函数模板参数推导或 CTAD (Class Template Argument Deduction)。

template<typename T>  
T add(T t1, T t2) {  
    return t1 + t2;  
}  
  
// 使用时,不需要显式指定模板参数类型  
auto result = add(3, 4);  // result 的类型为 int

结构化绑定 (Structured Binding)

虽然这不是直接关于函数声明的,但结构化绑定允许我们以更简洁的方式从函数返回多个值。这在 C++17 中被引入。

std::pair<int, int> getTwoNumbers() {  
    return {5, 10};  
}  
  
auto [a, b] = getTwoNumbers();  // a = 5, b = 10

Lambda 表达式

虽然 Lambda 表达式不是传统意义上的函数声明,但它们提供了一种在代码中定义匿名函数的方式。Lambda 表达式在 C++11 中被引入,并在此后的标准中得到了改进。

默认参数和函数重载

虽然这些特性在较早的 C++ 标准中就已经存在,但它们仍然是函数声明的重要组成部分。默认参数允许我们为函数参数提供默认值,而函数重载允许我们为同一函数名定义多个版本,每个版本接受不同类型的参数。这些特性增加了代码的灵活性和可读性。

03-12 15:29