C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- std::apply
- 库特性测试宏 (C++20)
- 程序支持工具
- std::initializer_list
- 函数对象
- std::hash
- std::pair
- std::tuple
- std::optional
- std::any
- std::variant
- 格式化库 (C++20)
- std::integer_sequence
- std::exchange
- std::make_from_tuple
- std::launder
- std::to_chars
- std::from_chars
- std::as_const
- std::source_location
- 变参数函数
- std::bitset
- std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal
- std::in_range
- std::declval
- std::forward
- std::move
- std::move_if_noexcept
- std::chars_format
- std::piecewise_construct_t
- std::piecewise_construct
- std::in_place, std::in_place_type, std::in_place_index, std::in_place_t, std::in_place_type_t, std::in_place_index_t
- 注释
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
std::declval
定义于头文件 <utility>
|
||
template<class T> typename std::add_rvalue_reference<T>::type declval() noexcept; |
(C++11 起) | |
将任意类型 T
转换成引用类型,令在 decltype 表达式中不必经过构造函数就能使用成员函数。
通常在模板中使用 declval
,模板接受的模板实参通常可能无构造函数,但有同一成员函数,均返回所需类型。
注意, declval
只能用于不求值语境,且不要求有定义;求值包含此函数的表达式是错误。通常,若 odr 使用此函数被则程序为病式。
参数
(无)
返回值
不能调用,从而决不返回值。返回类型是 T&&
,除非 T
是(可有 cv 限定的) void
,此情况下返回类型是 T
。
示例
运行此代码
#include <utility> #include <iostream> struct Default { int foo() const { return 1; } }; struct NonDefault { NonDefault() = delete; int foo() const { return 1; } }; int main() { decltype(Default().foo()) n1 = 1; // n1 的类型是 int // decltype(NonDefault().foo()) n2 = n1; // 错误:无默认构造函数 decltype(std::declval<NonDefault>().foo()) n2 = n1; // n2 的类型是 int std::cout << "n1 = " << n1 << '\n' << "n2 = " << n2 << '\n'; }
输出:
n1 = 1 n2 = 1
参阅
decltype 说明符 | 定义等价于表达式类型的类型(C++11) |
(C++11)(C++20 中移除)(C++17) |
推导以一组实参调用一个可调用对象的结果类型 (类模板) |