c++ 新的函数声明语法

右值引用(&&)

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

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

相关推荐
数学难5 分钟前
Java面试题2:Java线程池原理
java·开发语言
咸鱼求放生11 分钟前
Java 8 Stream API
java·开发语言
盒马盒马12 分钟前
Rust:Trait 抽象接口 & 特征约束
开发语言·rust
天使街23号13 分钟前
go-dongle v1.2.0 发布,新增 SM2 非对称椭圆曲线加密算法支持
开发语言·后端·golang
ThreeYear_s35 分钟前
【FPGA+DSP系列】——MATLAB simulink仿真三相桥式全控整流电路
开发语言·matlab·fpga开发
moiumxf0278q36 分钟前
C++中智能指针是如何工作的?
java·jvm·c++
yugi98783837 分钟前
MATLAB实现白噪声与色噪声仿真
开发语言·matlab
似水এ᭄往昔1 小时前
【C++】--模板进阶
开发语言·c++
AA陈超1 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P07-11 实现自动运行
c++·游戏·ue5·游戏引擎·虚幻
DARLING Zero two♡1 小时前
【优选算法】LinkedList-Concatenate:链表的算法之契
数据结构·c++·算法·链表