function template
<utility>

std::declval

template <class T>  typename add_rvalue_reference<T>::type declval() noexcept;
声明值
返回类型为T右值引用,而不引用任何对象。

此函数只能用于未求值表达式(例如sizeofdecltype的操作数)。

T可以是incomplete type。

这是一个辅助函数,用于在未求值表达式中引用类成员,特别是当构造函数签名未知时,或者当无法构造该类型的对象时(例如对于抽象基类)。

参数



返回值

类型为T右值引用
返回类型使用add_rvalue_reference为对象类型T返回T&&

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// declval example
#include <utility>      // std::declval
#include <iostream>     // std::cout

struct A {              // abstract class
  virtual int value() = 0;
};

class B : public A {    // class with specific constructor
  int val_;
public:
  B(int i,int j):val_(i*j){}
  int value() {return val_;}
};

int main() {
  decltype(std::declval<A>().value()) a;  // int a
  decltype(std::declval<B>().value()) b;  // int b
  decltype(B(0,0).value()) c;   // same as above (known constructor)
  a = b = B(10,2).value();
  std::cout << a << '\n';
  return 0;
}

输出
20


数据竞争

调用此函数不会引入数据竞争。

异常

无异常保证:此函数从不抛出异常。

另见