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

相关推荐
cfm_29146 分钟前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
C++ 老炮儿的技术栈1 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011161 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据1 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡2 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai2 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间2 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing
小努蛋3 小时前
linux编译openresty异常问题,lua_cjson.c:706:5: 错误: ‘for‘ 循环初始化声明只在 C99 或 C++ 模式下允许
开发语言·lua·openresty
qz_Serene3 小时前
C++:类和对象(上)
开发语言·c++
西安景驰电子4 小时前
《PTP精确时间协议系列》第一篇:从原理到应用,全面解读IEEE 1588
linux·运维·服务器·开发语言·网络·windows·php