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
-
数据竞争
调用此函数不会引起任何数据争用。 -
异常安全
这函数不会抛出异常。 -