Avi*_*ohn 3 c++ reference option-type c++17
我读过有关std::optional<std::reference_wrapper<T>>传递可选参考文献的方法。
但是,我无法想到一个实际的例子,我可以这样做,而不是仅仅使用optional<T>&.
例如,假设我正在编写一个需要vector<int>通过引用获取可选值的函数。
我可以这样做:
void f(optional<reference_wrapper<vector<int>>> v) {
// ...
}
int main() {
vector<int> v = {1, 2, 3, 4};
f(make_optional<reference_wrapper<vector<int>>>(std::ref(v));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但为什么不这样做呢?
void f(optional<vector<int>>& v) {
// ...
}
int main() {
f(make_optional<vector<int>>>(std::initializer_list{1, 2, 3, 4}));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请举个例子,其中optional<reference_wrapper<T>>更适合optional<T>&。我不清楚语义差异,尤其是它们在实践中的利用方式。
std::optional<T> &是对可以拥有对象的可选对象的引用T。您可以改变 a T(如果包含一个),也可以清除通过引用传入的可选对象,从而销毁包含的T.
std::optional<std::reference_wrapper<T>>是一个可选对象,它可以拥有对 a 的引用T,但它实际上并不拥有其T本身。生命T存在于物体之外std::optional。您可以改变T(如果包含引用),也可以清除可选对象,这不会破坏T. 您还可以使可选对象指向不同的T,但这毫无意义,因为调用者正在按值向您传递可选对象。
请注意,我们已经在语言中内置了一个类型,这意味着“对 a 的可选引用T”: T*。原始指针和可选引用都具有基本相同的语义:您要么什么也得不到,要么获得一个不属于您的对象的句柄。在现代 C++ 中,原始指针是表达不属于接收者的可选值的方式。
我想不出任何一个我会明确使用std::optional<std::reference_wrapper<T>>而不是 的原因T*。