Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Template is_reference trong C++ STL

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)>.