std::is_lvalue_reference (header <type_traits>) kiểm tra xem kiểu T có phải là lvalue reference (T&) hay không.
Lvalue và Lvalue Reference
- Lvalue: Biểu thức chỉ đến object có địa chỉ ổn định, có tên, tồn tại sau biểu thức. VD: biến
x,*ptr,arr[0]. - Lvalue reference: Kiểu
T&, alias cho lvalue. VD:int& r = x;.
Cú pháp
template <class T> struct is_lvalue_reference;
Ví dụ kiểm tra
#include <iostream>
#include <type_traits>
using namespace std;
class TP { };
int main() {
cout << boolalpha;
cout << "Kiểm tra is_lvalue_reference:\n";
// Kiểu cơ bản
cout << "int: " << is_lvalue_reference<int>::value << '\n'; // false
cout << "int&: " << is_lvalue_reference<int&>::value << '\n'; // true
cout << "int&&: " << is_lvalue_reference<int&&>::value << '\n'; // false
cout << "char: " << is_lvalue_reference<char>::value << '\n'; // false
cout << "char&: " << is_lvalue_reference<char&>::value << '\n'; // true
cout << "char&&: " << is_lvalue_reference<char&&>::value << '\n'; // false
cout << "float: " << is_lvalue_reference<float>::value << '\n'; // false
cout << "float&: " << is_lvalue_reference<float&>::value << '\n'; // true
cout << "float&&: " << is_lvalue_reference<float&&>::value << '\n'; // false
cout << "double: " << is_lvalue_reference<double>::value << '\n'; // false
cout << "double&: " << is_lvalue_reference<double&>::value << '\n'; // true
cout << "double&&: " << is_lvalue_reference<double&&>::value << '\n'; // false
// Class
cout << "TP: " << is_lvalue_reference<TP>::value << '\n'; // false
cout << "TP&: " << is_lvalue_reference<TP&>::value << '\n'; // true
cout << "TP&&: " << is_lvalue_reference<TP&&>::value << '\n'; // false
// Const
cout << "const int&: " << is_lvalue_reference<const int&>::value << '\n'; // true
cout << "const int&&:" << is_lvalue_reference<const int&&>::value << '\n'; // false
return 0;
}
Đầu ra
Kiểm tra is_lvalue_reference: int: false int&: true int&&: false char: false char&: true char&&: false float: false float&: true float&&: false double: false double&: true double&&: false TP: false TP&: true TP&&: false const int&: true const int&&: false
So sánh ba trait tham chiếu
| Kiểu T | is_lvalue_reference | is_rvalue_reference | is_reference |
|---|---|---|---|
int | false | false | false |
int& | true | false | true |
int&& | false | true | true |
const int& | true | false | true |
const int&& | false | true | true |
Mối quan hệ
is_reference ≡ is_lvalue_reference || is_rvalue_reference
Ứng dụng thực tế
- Perfect forwarding: Kết hợp với
std::forward. - Overload resolution: Phân biệt copy (lvalue) vs move (rvalue).
- SFINAE:
enable_if_t<is_lvalue_reference_v<T>>.
Lưu ý về Universal Reference
Trong template<class T> void func(T&& param), T được deduction thành:
U&nếu argument là lvalue →paramtype làU&(lvalue reference).Unếu argument là rvalue →paramtype làU&&(rvalue reference).
param là lvalue/rvalue reference, dùng is_lvalue_reference<decltype(param)>.