std::ref
/页面上的示例std::cref
显示了使用std::ref
/以一种看起来像通过引用获取参数的方式std::cref
传递参数,而实际上它通过值获取所有参数。std::bind
std::bind
只看那个例子,我也可能对 的存在一无所知std::reference_wrapper
,并且std::ref
只是一个允许链接示例表现出的行为的函数。
这就是我std::ref
在问题标题和以下内容中的意思。
主要是为了好玩,我尝试实现std::ref
自己,我想出了这个:
template<typename T>
struct ref_wrapper {
ref_wrapper(T& t) : ref(t) {}
T& ref;
operator T&() const {
return ref;
}
};
template<typename T>
ref_wrapper<T> ref(T& t) {
return ref_wrapper{t}; // Ooops
}
template<typename T>
ref_wrapper<const T> cref(const T& t) {
return ref_wrapper{t}; // Ooops
}
在标记为// Ooops
我错误地使用 CTAD的行上,因为我正在使用-std=c++17
. 通过更改ref_wrapper
为ref_wrapper<T>
并ref_wrapper<const T>
在这两种情况下更正了这一点。
然后我偷看了一眼/usr/include/c++/10.2.0/bits/refwrap.h
。
一方面,我看到 / 的实现与/ref
的实现cref
非常相似。std::ref
std::cref
另一方面,我看到它std::reference_wrapper
大约有 60 行长!里面有很多东西,包括noexcept
, 宏, 复制 ctor, 复制operator=
, get
.
我认为其中大部分与std::reference_wrapper
仅用作从属std::ref
无关,但有些东西可能是相关的,例如构造函数采用通用引用。
所以我的问题是:就我的瘦身尝试而言,工作的std::reference_wrapper
必要条件和充分条件是什么?std::ref
我刚刚意识到std::reference_wrapper
on cppreference有一个可能的实现(它比来自 GCC 的噪音小)。然而,即使在这里,也有一些我不明白的原因,例如operator()
。