std::declval
来自cppreference.com
该页由英文版wiki使用Google Translate机器翻译而来。
该翻译可能存在错误或用词不当。鼠标停留在文本上可以看到原版本。你可以帮助我们修正错误或改进翻译。参见说明请点击这里. |
在头文件 <utility> 中定义
|
||
template< class T > typename std::add_rvalue_reference<T>::type declval(); |
(C++11 起) | |
任何类型
T
转换为引用类型,使得它可以使用decltype表达式中没有指定构造函数的成员函数。它通常用于在可接受的模板参数可能没有构造函数中常见的模板,但具有相同的成员函数的返回类型是必要的。 std::declval只能用于非计算环境下,这是一个错误,来评估一个表达式,其中包含此功能.原文:
Converts any type
T
to a reference type, making it possible to use member functions in decltype expressions without specifying constructors. It is commonly used in templates where acceptable template parameters may have no constructor in common, but have the same member function whose return type is needed. std::declval can only be used in unevaluated contexts, it is an error to evaluate an expression that contains this function.目录 |
[编辑] 参数
(无)
[编辑] 返回值
不会被调用,因此永远不会返回一个值,但返回类型是
T&&
除非T
是一个左值的引用类型,在这种情况下,T&
返回.原文:
Cannot be called, thus never returns a value, but the return type is
T&&
unless T
is an lvalue reference type, in which case T&
is returned.[编辑] 例外
[编辑] 示例
#include <utility> #include <iostream> struct Default { int foo() const {return 1;} }; struct NonDefault { NonDefault(const NonDefault&) {} int foo() const {return 1;} }; int main() { decltype(Default().foo()) n1 = 1; // int n1 // decltype(NonDefault().foo()) n2 = n1; // will not compile decltype(std::declval<NonDefault>().foo()) n2 = n1; // int n2 std::cout << "n2 = " << n2 << '\n'; }
输出:
n2 = 1
[编辑] 另请参阅
decltype说明 | 定义了一个类型相当于一个表达式(C++11)类型
原文: defines a type equivalent to the type of an expression (C++11) |
(C++11) |
推导函数表达式的返回值类型 (类模板) |