C++11 关于右值引用、左值引用和通用引用的思考
一、通用引用 类型声明形式为 type&& 其中 type 类型是要进行推导的,如果类型推导没有发生,那么 type&& 代表一个右值引用 如果一个对象被声明为 auto&&,这个形参或者对象就是一个通用引用 通用引用,如果它被右值初始化,就会对应地成为右值引用;如果它被左值初始化,就会成为左值引用 如果在一个类模板里面看见了一个函数形参类型为 T&&,也不一定就是通用引用,可能并没有发生类型推导 void f(Widget&& param); //右值引用 Widget&& var1 = Widget(); //右值引用 auto&& var2 = var1; //通用引用(不是右值引用) template<typename T> void f(std::vector<T>&& param); //右值引用 template<typename T> void f(T&& param); //通用引用(不是右值引用) template <typename T> void f(const T&& param); //param是一个右值引用,因为添加了 const 限定符 // 函数模板 一般可能是通用引用 template <typename T> void print_reference_type(T &&i) { // T&& 或是 auto&& if (std::is_lvalue_reference<decltype(i)>::value) { std::cout << "lvalue: " << i << std::endl; } else if (std::is_rvalue_reference<decltype(i)>::value) { std::cout << "rvalue: " << i << std::endl; } else { std::cout << "unknown value: " << i << std::endl; } } // 因为 push_back 在有一个特定的 vector 实例之前不可能存在, // 而实例化 vector 时的类型已经决定了 push_back 的声明 // 所以在这里并没有发生类型推导 template<class T, class Allocator = allocator<T>> //来自C++标准 class vector { public: void push_back(T&& x); … } 一个记录任意函数调用的时间开销的函数模板...