C++

编译器支持

自由(freestanding)与宿主(hosted)

语言

标准库

标准库头文件

具名要求

特性测试宏 (C++20)

语言支持库

概念库 (C++20)

诊断库

内存管理库

元编程库 (C++11)

通用工具库

容器库

迭代器库

范围库 (C++20)

算法库

字符串库

文本处理库

数值库

日期和时间库

输入/输出库

文件系统库 (C++17)

并发支持库 (C++11)

执行控制库 (C++26)

技术规范

符号索引

外部库

[编辑] C++ 语言

通用主题

预处理器

注释

关键词

转义序列

流程控制

条件执行语句

if

switch

迭代语句(循环)

for

range-for (C++11)

while

do-while

跳转语句

continue - break

goto - return

函数

函数声明

Lambda 函数表达式

inline 说明符

动态异常规范 (直到 C++17*)

noexcept 说明符 (C++11)

异常

throw 表达式

try 块

catch 处理程序

命名空间

命名空间声明

命名空间别名

类型

基本类型

枚举类型

函数类型

类/结构体类型

联合类型

说明符

const/volatile

decltype (C++11)

auto (C++11)

constexpr (C++11)

consteval (C++20)

constinit (C++20)

存储期说明符

初始化

默认初始化

值初始化

零初始化

复制初始化

直接初始化

聚合初始化

列表初始化 (C++11)

常量初始化

引用初始化

表达式

值类别

求值顺序

运算符

运算符优先级

替代表示

字面量

布尔 - 整型 - 浮点型

字符 - 字符串 - nullptr (C++11)

用户定义 (C++11)

工具

属性 (C++11)

类型

typedef 声明

类型别名声明 (C++11)

类型转换

隐式转换

static_cast

const_cast

显式转换

dynamic_cast

reinterpret_cast

内存分配

new 表达式

delete 表达式

类声明

构造函数

this 指针

访问说明符

friend 说明符

类特有的函数属性

虚函数

override 说明符 (C++11)

final 说明符 (C++11)

explicit (C++11)

static

特殊成员函数

默认构造函数

复制构造函数

移动构造函数 (C++11)

复制赋值

移动赋值 (C++11)

析构函数

模板

类模板

函数模板

模板特化

参数包 (C++11)

杂项

内联汇编

C++ 历史

[编辑] 语句

标签

标号 : 语句

表达式语句

表达式 ;

复合语句

{ 语句... }

选择语句

if

switch

迭代语句

while

do while

for

range for (C++11)

跳转语句

break

continue

return

goto

断言

contract_assert (C++26)

声明语句

声明 ;

Try 块

try 块

事务内存

synchronized, atomic_commit, 等 (TM TS)

[编辑]

终止当前函数并将指定值(如果有)返回给调用者。

目录

1 语法

2 解释

3 注意

3.1 从局部变量和参数的自动移动

3.2 保证的复制省略

4 关键词

5 示例

6 缺陷报告

7 参阅

[编辑] 语法

attr (可选) return expression (可选) ;

(1)

attr (可选) return braced-init-list ;

(2)

(C++11 起)

attr (可选) co_return expression (可选) ;

(3)

(C++20 起)

attr (可选) co_return braced-init-list ;

(4)

(C++20 起)

属性

-

(C++11 起) 任意数量的属性序列

表达式

-

表达式,可转换为函数返回类型

braced-init-list

-

用花括号括起来的初始化列表

[编辑] 解释

1) 评估 expression,终止当前函数并将 expression 的结果(经过向函数返回类型的隐式转换后)返回给调用者。expression 在返回类型为 (可能是 cv-qualified) void 的函数中是可选的,在构造函数和析构函数中则不允许。

2) 使用复制列表初始化来构造函数的返回值。

3,4) 在协程中,对于最终挂起点必须使用关键字 co_return 而不是 return(详情请参阅协程)。

在函数调用结果的复制初始化和 expression 结束时所有临时对象的销毁之间有一个序列点。

(C++11 前)

函数调用结果的复制初始化先于 expression 结束时所有临时对象的销毁进行,而临时对象的销毁又先于包含 return 语句的块的局部变量的销毁进行。

(C++11 起)

如果函数的返回类型是引用类型,并且 return 语句 (1,2) 将返回的引用绑定到临时表达式的结果,则程序格式错误。

(C++26 起)

如果控制流到达以下函数的末尾

返回类型为 (可能是 cv-qualified) void 的函数,构造函数,析构函数,或者返回类型为 (可能是 cv-qualified) void 的函数 try 块

而没有遇到 return 语句,则执行 return;。

如果控制流到达main 函数的末尾,则执行 return 0;。

除了 main 函数和特定的协程(C++20 起) 之外,值返回函数在没有 return 语句的情况下执行到末尾是未定义行为。

在返回 (可能是 cv-qualified) void 的函数中,如果表达式类型是 (可能是 cv-qualified) void,则可以使用带 expression 的 return 语句。

如果函数的返回类型指定为占位符类型,它将从返回值推导。

(C++14 起)

[编辑] 注意

按值返回可能涉及临时对象的构造和复制/移动,除非使用复制省略。具体来说,复制/移动的条件如下:

从局部变量和参数的自动移动

如果 expression 是一个(可能是带括号的)标识符表达式,它命名了一个具有自动存储持续时间且类型为:

非 volatile 对象类型

(C++11 起)

或非 volatile 右值引用对象类型

(C++20 起)

且该变量声明在

最内层包围函数或 lambda 表达式的函数体中或作为其参数

的变量,则 expression 是*可移动的*。

(C++11 起)

如果 expression 是可移动的,用于选择构造函数以初始化返回值或,对于 co_return,用于选择 promise.return_value() 的重载(C++20 起) 的重载决议将执行*两次*:

首先,就好像 expression 是一个右值表达式(因此它可能选择移动构造函数),并且

如果第一次重载决议失败

(C++11 起)(直至 C++23)

或者成功了,但没有选择移动构造函数(形式上,所选构造函数的第一个参数不是对 expression 的(可能是 cv-qualified)类型的右值引用)

(C++11 起)(C++20 前)

则按照通常的方式执行重载决议,将 expression 视为左值(因此它可能选择复制构造函数)。

(C++11 起)(直至 C++23)

如果 expression 是可移动的,则将其视为 xvalue(因此重载决议可能选择移动构造函数)。

(C++23 起)

保证的复制省略

如果 expression 是一个纯右值,则结果对象由该表达式直接初始化。当类型匹配时,这不涉及复制或移动构造函数(参阅复制省略)。

(C++17 起)

功能测试宏

标准

特性

__cpp_implicit_move

202207L

(C++23)

隐式移动的简化

[编辑] 关键字

return, co_return

[编辑] 示例

运行此代码

#include

#include

#include

void fa(int i)

{

if (i == 2)

return;

std::cout << "fa("<< i << ")\n";

} // implied return;

int fb(int i)

{

if (i > 4)

return 4;

std::cout << "fb(" << i << ")\n";

return 2;

}

std::pair fc(const char* p, int x)

{

return {p, x};

}

void fd()

{

return fa(10); // fa(10) is a void expression

}

int main()

{

fa(1); // prints its argument, then returns

fa(2); // does nothing when i == 2, just returns

int i = fb(5); // returns 4

i = fb(i); // prints its argument, returns 2

std::cout << "i = " << i << '\n'

<< "fc(~).second = " << fc("Hello", 7).second << '\n';

fd();

}

struct MoveOnly

{

MoveOnly() = default;

MoveOnly(MoveOnly&&) = default;

};

MoveOnly move_11(MoveOnly arg)

{

return arg; // OK. implicit move

}

MoveOnly move_11(MoveOnly&& arg)

{

return arg; // OK since C++20. implicit move

}

MoveOnly&& move_23(MoveOnly&& arg)

{

return arg; // OK since C++23. implicit move

}

输出

fa(1)

fb(4)

i = 2

fc(~).second = 7

fa(10)

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告

应用于

发布时的行为

正确的行为

CWG 1541

C++98

如果返回类型是 cv-qualified void,则 expression 不能省略

它可以省略

CWG 1579

C++11

不允许通过转换移动构造函数返回

允许转换移动构造函数查找

CWG 1885

C++98

自动变量销毁的顺序不明确

添加了排序规则

[编辑] 另请参阅

复制省略

C 文档 关于 return 语句