【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 }