通过手撕std::ref来了解其工作原理

写在前面:
假设有变量int a;
std::ref(a) 返回的是reference_wrapper(a), 而不是 int&

下面来看std::ref的原理:
std::ref 的原理可以通过一个简单的模板类来实现。下面是一个简化的实现,供参考:

template<typename T>
class reference_wrapper {
public:
    // 构造函数,接受一个引用并保存它
    explicit reference_wrapper(T& ref) noexcept : ref_(std::addressof(ref)) {}

    // 重载解引用运算符,返回保存的引用
    operator T&() const noexcept { return *ref_; }

    // 重载成员访问运算符,用于访问保存的引用的成员
    T* operator->() const noexcept { return ref_; }

private:
    T* ref_; // 保存的引用
};

// 辅助函数,用于创建 reference_wrapper 对象
template<typename T>
reference_wrapper<T> ref(T& t) noexcept {
    return reference_wrapper<T>(t);
}

reference_wrapper 类模板包含一个成员指针 ref_,用于保存传入的引用。它有一个构造函数,接受一个引用并保存它。它还重载了解引用运算符和成员访问运算符,使得 reference_wrapper 对象可以像引用一样被使用。

ref 辅助函数用于创建 reference_wrapper 对象,它接受一个引用并返回一个包装了该引用的 reference_wrapper 对象。

std::ref 和上面实现的 ref 函数的原理基本相同:它们都是接受一个引用并返回一个包装了该引用的对象。通过包装引用,我们可以将一个对象传递给函数对象或函数时,使函数对象或函数能够修改对象的值,而不是修改其副本。

你可能感兴趣的:(C++,c++,笔记)