【C++编程】std::dclval 使用教程

std::declval (c++11 only)

函数模板

template<typename T>
typename add_rvalue_reference<T>::type declval() noexcept;

功能描述:

 返回一个类型的右值引用,不管是否有没有默认构造函数或该类型不可以创建对象。(可以用于抽象基类);

参数:

返回值:

类型T的右值引用

1. 示例

 1 // declval example
 2 #include <utility>      // std::declval
 3 #include <iostream>     // std::cout
 4  
 5 struct A {              // abstract class
 6   virtual int value() = 0;
 7 };
 8  
 9 class B : public A {    // class with specific constructor
10   int val_;
11 public:
12   B(int i,int j):val_(i*j){}
13   int value() {return val_;}
14 };
15  
16 int main() {
17   decltype(std::declval<A>().value()) a;  // int a
18   decltype(std::declval<B>().value()) b;  // int b
19   decltype(B(0,0).value()) c;   // same as above (known constructor)
20   a = b = B(10,2).value();
21   std::cout << a << '\n';
22   return 0;
23 }

 

2. 示例:

 1 #include <utility>
 2 #include <iostream>
 3 
 4 struct Default { int foo() const { return 1; } };
 5 
 6 struct NonDefault
 7 {
 8     NonDefault(const NonDefault&) { }
 9     int foo() const { return 1; }
10 };
11 
12 int main()
13 {
14     decltype(Default().foo()) n1 = 1;                   // type of n1 is int
15 //  decltype(NonDefault().foo()) n2 = n1;               // error: no default constructor
16     decltype(std::declval<NonDefault>().foo()) n2 = n1; // type of n2 is int
17     std::cout<< "n1 = " << n1 << '\n'
18     std::cout<< "n2 = " << n2 << '\n';
19 }

 

posted @ 2021-09-12 21:16  苏格拉底的落泪  阅读(160)  评论(0编辑  收藏  举报