C++ utility declval 函数

  • 定义和用法

    template <class T>
      typename add_rvalue_reference<T>::type declval() noexcept;
    std::declval 返回对类型T的右值引用,而不引用任何对象。此函数只能用于未求值的操作数(例如sizeof和decltype的操作数)。T可能是不完整的类型。这是一个辅助函数,用于在未求值的操作数中引用类的成员,尤其是在构造函数签名未知或无法构造该类型的对象时(例如,抽象基类)。
  • 参数

    没有。
  • 返回值

    对T类型的右值引用。当T是对象类型时,返回类型使用add_rvalue_reference返回T&&。
  • 示例

    
    // 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
    
  • 数据竞争

    调用此函数不会引起任何数据争用。
  • 异常安全

    这函数不会抛出异常。
  • 相关页面

    forward 转发参数(函数模板)
    move 作为右值移动(函数模板)
    common_type 公共类型(类模板)