C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- C++ 具名要求: 函数对象 (FunctionObject)
- C++ 具名要求: 二元谓词 (BinaryPredicate)
- C++ 具名要求: 可默认构造 (DefaultConstructible)
- C++ 具名要求: 可复制赋值 (CopyAssignable)
- C++ 具名要求: 可复制构造 (CopyConstructible)
- C++ 具名要求: 可移动赋值 (MoveAssignable) (C++11 起)
- C++ 具名要求: 可移动构造 (MoveConstructible) (C++11 起)
- C++ 具名要求: 可析构 (Destructible)
- C++ 具名要求: 可平凡复制 (TriviallyCopyable)
- C++ 具名要求: 可相等比较 (EqualityComparable)
- C++ 具名要求: 可小于比较 (LessThanComparable)
- C++ 具名要求: 比较 (Compare)
- C++ 具名要求: 字面类型 (LiteralType)
- C++ 具名要求: 简旧数据类型 (PODType)
- C++ 具名要求: 平凡类型 (TrivialType)
- C++ 具名要求: 标准布局类型 (StandardLayoutType)
- C++ 具名要求: 遗留向前迭代器 (LegacyForwardIterator)
- C++ 具名要求: 可交换 (Swappable)
- C++ 具名要求: 值可交换 (ValueSwappable)
- C++ 具名要求: 可空指针 (NullablePointer) (C++11 起)
- C++ 具名要求: 散列 (Hash)
- C++ 具名要求: 分配器 (Allocator)
- C++ 具名要求: 可调用 (Callable)
- C++ 具名要求: 谓词 (Predicate)
- C++ 具名要求: 容器 (Container)
- C++ 具名要求: 序列容器 (SequenceContainer)
- C++ 具名要求: 连续容器 (ContiguousContainer)
- C++ 具名要求: 可逆容器 (ReversibleContainer)
- C++ 具名要求: 关联容器 (AssociativeContainer)
- C++ 具名要求: 具分配器容器 (AllocatorAwareContainer)
- C++ 具名要求: 无序关联容器 (UnorderedAssociativeContainer)
- C++ 具名要求: 可默认插入 (DefaultInsertable)
- C++ 具名要求: 可复制插入 (CopyInsertable)
- C++ 具名要求: 可移动插入 (MoveInsertable) (C++11 起)
- C++ 具名要求: 可就位构造 (EmplaceConstructible) (C++11 起)
- C++ 具名要求: 可擦除 (Erasable)
- C++ 具名要求: 遗留迭代器 (LegacyIterator)
- C++ 具名要求: 遗留输出迭代器 (LegacyOutputIterator)
- C++ 具名要求: 遗留输入迭代器 (LegacyInputIterator)
- C++ 具名要求: 遗留双向迭代器 (LegacyBidirectionalIterator)
- C++ 具名要求: 遗留随机访问迭代器 (LegacyRandomAccessIterator)
- C++ 具名要求: 遗留连续迭代器 (LegacyContiguousIterator)
- C++ 具名要求: 常量表达式迭代器 (ConstexprIterator)
- C++ 具名要求: 有格式输入函数 (FormattedInputFunction)
- C++ 具名要求: 无格式输入函数 (UnformattedInputFunction)
- C++ 具名要求: 有格式输出函数 (FormattedOutputFunction)
- C++ 具名要求: 无格式输出函数 (UnformattedOutputFunction)
- C++ 具名要求: 种子序列 (SeedSequence)
- C++ 具名要求: 随机数引擎 (RandomNumberEngine)
- C++ 具名要求: 随机数分布 (RandomNumberDistribution)
- C++ 具名要求: 均匀随机位生成器 (UniformRandomBitGenerator)
- C++ 具名要求: 随机数引擎适配器 (RandomNumberEngineAdaptor)
- C++ 具名要求: 基本可锁定 (BasicLockable)
- C++ 具名要求: 可锁定 (Lockable)
- C++ 具名要求: 可定时锁定 (TimedLockable)
- C++ 具名要求: 互斥体 (Mutex)
- C++ 具名要求: 定时互斥体 (TimedMutex)
- C++ 具名要求: 共享互斥体 (SharedMutex)
- C++ 具名要求: 共享定时互斥体 (SharedTimedMutex)
- C++ 具名要求: 字符特征 (CharTraits)
- C++ 具名要求: 正则表达式特征 (RegexTraits)
- C++ 具名要求: 位掩码类型 (BitmaskType)
- C++ 具名要求: 数值类型 (NumericType)
- C++ 具名要求: 一元类型特征 (UnaryTypeTrait)
- C++ 具名要求: 二元类型特征 (BinaryTypeTrait)
- C++ 具名要求: 变换特征 (TransformationTrait)
- C++ 具名要求: 时钟 (Clock)
- C++ 具名要求: 平凡时钟 (TrivialClock)
- 注释
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
C++ 具名要求: 可调用 (Callable)
可调用 (Callable) 类型是可应用 INVOKE 操作(例如用于 std::function、std::bind 和 std::thread::thread)的类型。此操作可以用库函数 std::invoke 显式进行。 (C++17 起)
要求
若满足下列条件,则类型 T
满足可调用 (Callable)
给定
-
T
类型的对象f
- 适合的实参类型列表
ArgTypes
- 适合的返回类型
R
则下列表达式必须合法:
表达式 | 要求 |
---|---|
INVOKE<R>(f, std::declval<ArgTypes>()...) | 该表达式在不求值语境中良构 |
其中 INVOKE<R>(f, t1, t2, ..., tN),若 R
是可有 cv 限定的 void,则定义为 static_cast<void>(INVOKE(f, t1, t2, ..., tN)),否则为 INVOKE(f, t1, t2, ..., tN),隐式转换成 R
其中 INVOKE(f, t1, t2, ..., tN) 定义如下:
- 若
f
是类T
的成员函数指针:
- 若 std::is_base_of<T, std::remove_reference_t<decltype(t1)>>::value 为 true,则 INVOKE(f, t1, t2, ..., tN) 等价于 (t1.*f)(t2, ..., tN)
- 否则,若 std::remove_cvref_t<decltype(t1)> 为 std::reference_wrapper 的特化,则 INVOKE(f, t1, t2, ..., tN) 等价于 (t1.get().*f)(t2, ..., tN) (C++17 起)
- 否则,若
t1
不满足前述条件,则 INVOKE(f, t1, t2, ..., tN) 等价于 ((*t1).*f)(t2, ..., tN)。
- 否则,若 N == 1 且
f
是类T
的数据成员指针:
- 若 std::is_base_of<T, std::remove_reference_t<decltype(t1)>>::value 为 true,则 INVOKE(f, t1) 等价于 t1.*f
- 否则,若 std::remove_cvref_t<decltype(t1)> 是 std::reference_wrapper 的特化,则 INVOKE(f, t1) 等价于 t1.get().*f (C++17 起)
- 否则,若
t1
不满足前述条件,则 INVOKE(f, t1) 等价于 (*t1).*f
- 否则,INVOKE(f, t1, t2, ..., tN) 等价于 f(t1, t2, ..., tN)(即
f
是一个函数对象 (FunctionObject) )
注解
对于成员函数指针和数据成员指针,t1
可以是一个常规指针或一个重载了 operator*
的类的对象,例如 std::unique_ptr 或 std::shared_ptr。
数据成员指针为可调用 (Callable) ,尽管并不发生函数调用。
标准库
此外,下列标准库设施接受任何可调用 (Callable) 类型(不仅是函数对象 (FunctionObject) )
std::function | |
std::bind | |
std::result_of | |
std::thread::thread | |
std::call_once | |
std::async | |
std::packaged_task | |
std::reference_wrapper |
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2420 | C++11 | 当 R 为 void 时,结果必须可隐式转换为 void(这是不可能的) | 当 R 为 void 时结果可以显式转换后为 void |
参阅
检查类型能否以给定的实参类型调用(如同以 std::invoke) (类模板) |