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

Template is_lvalue_reference trong C++ STL

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 Tis_lvalue_referenceis_rvalue_referenceis_reference
intfalsefalsefalse
int&truefalsetrue
int&&falsetruetrue
const int&truefalsetrue
const int&&falsetruetrue

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 → param type là U& (lvalue reference).
  • U nếu argument là rvalue → param type là U&& (rvalue reference).
Để kiểm tra param là lvalue/rvalue reference, dùng is_lvalue_reference<decltype(param)>.