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


資料競爭

呼叫此函式不會引入資料競爭。

異常

無異常保證:此函式從不丟擲異常。

另見