c++ - optional<reference_wrapper<T>> 与 optional<T>& - 实际示例?

标签 c++ reference c++17 option-type

我读过 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;
}

但为什么不这样做呢?

void f(optional<vector<int>>& v) {
    // ...
}

int main() {
    f(make_optional<vector<int>>>(std::initializer_list{1, 2, 3, 4}));
    return 0;
}

请举例optional<reference_wrapper<T>>优于 optional<T>& .我不清楚语义上的差异,尤其是在实践中可以利用它们的方式。

最佳答案

std::optional<T> &是对可以拥有 T 的可选对象的引用目的。你可以改变 T (如果包含)或者您可以清除通过引用传入的可选对象,从而破坏包含的T .


std::optional<std::reference_wrapper<T>>是一个可选对象,可以拥有对 T 的引用, 但它实际上并不拥有 T T生活在std::optional 之外目的。你可以改变 T (如果包含引用)或者您可以清除可选对象,这不会破坏 T .您还可以将可选对象指向不同的T , 但这有点毫无意义,因为调用者正在向您传递一个可选的按值。

请注意,我们已经有一个内置于语言的类型,意思是“对 T 的可选引用”:T* .原始指针和可选引用具有基本相同的语义:要么一无所获,要么获得一个不属于你的对象的句柄。在现代 C++ 中,原始指针是表达不属于接收者的可选值的方式。

我想不出一个明确使用 std::optional<std::reference_wrapper<T>> 的原因而不是 T* .

关于c++ - optional<reference_wrapper<T>> 与 optional<T>& - 实际示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62454934/

相关文章:

c++ - C++17 中不可复制变量的成员初始化

C++:平台相关类型 - 最佳模式

c++ - 在 C++ 中可靠地比较不同机器的时间戳

c++ - 使用 decltype 理解类型推导

python - 枚举树中的所有路径

c++ - 从静态成员函数推断类模板参数的模式

c++ - 图实现 C++

C++ 使对象依赖于其他对象是一个好的设计吗?

c++ - 为什么这个程序在 C++14 中编译得很好,但在 C++11 编译器中却不行?

c++ - 改进折叠功能