std::is_reference (trong header <type_traits>) kiểm tra xem một kiểu T có phải là kiểu tham chiếu (reference type) hay không. Bao gồm cả lvalue reference (T&) và rvalue reference (T&&).
Cú pháp
template <class T> struct is_reference;
Giá trị kết quả: is_reference<T>::value (kiểu bool) hoặc is_reference_v<T> (C++17).
Kiểu tham chiếu trong C++
- Lvalue reference (
T&): Tham chiếu đến object có tên, có địa chỉ ổn định. VD:int& r = x; - Rvalue reference (
T&&): Tham chiếu đến object tạm thời (temporary), dùng cho move semantics. VD:int&& rr = 42;
Ví dụ kiểm tra các kiểu
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
cout << boolalpha;
cout << "Kiểm tra is_reference:\n";
// Kiểu cơ bản
cout << "int: " << is_reference<int>::value << '\n'; // false
cout << "int&: " << is_reference<int&>::value << '\n'; // true
cout << "int&&: " << is_reference<int&&>::value << '\n'; // true
cout << "char: " << is_reference<char>::value << '\n'; // false
cout << "char&: " << is_reference<char&>::value << '\n'; // true
cout << "char&&: " << is_reference<char&&>::value << '\n'; // true
cout << "float: " << is_reference<float>::value << '\n'; // false
cout << "float&: " << is_reference<float&>::value << '\n'; // true
cout << "float&&: " << is_reference<float&&>::value << '\n'; // true
cout << "double: " << is_reference<double>::value << '\n'; // false
cout << "double&: " << is_reference<double&>::value << '\n'; // true
cout << "double&&: " << is_reference<double&&>::value << '\n'; // true
// Class tự định nghĩa
class TP {};
cout << "TP: " << is_reference<TP>::value << '\n'; // false
cout << "TP&: " << is_reference<TP&>::value << '\n'; // true
cout << "TP&&: " << is_reference<TP&&>::value << '\n'; // true
// Con trỏ KHÔNG phải reference
cout << "int*: " << is_reference<int*>::value << '\n'; // false
cout << "const int&:" << is_reference<const int&>::value << '\n'; // true
return 0;
}
Đầu ra
Kiểm tra is_reference: int: false int&: true int&&: true char: false char&: true char&&: true float: false float&: true float&&: true double: false double&: true double&&: true TP: false TP&: true TP&&: true int*: false const int&: true
Mối quan hệ với type traits khác
is_reference::value == is_lvalue_reference::value || is_rvalue_reference::value
Ứng dụng
- Template metaprogramming: điều chỉnh hành vi tùy theo T là reference hay value.
- Perfect forwarding: kết hợp với
std::forward. - SFINAE: enable/disable overload dựa trên kiểu tham chiếu.
Lưu ý
is_reference chỉ kiểm tra kiểu T, không kiểm tra biểu thức. Để kiểm tra biểu thức là lvalue/rvalue, dùng std::is_lvalue_reference<decltype(expr)>.