为什么 optional<T&> 应该重新绑定赋值?

Why should optional<T&> rebind on assignment?

关于 optionalvariant 应该如何处理引用类型,尤其是在赋值方面,一直存在争论。我想更好地理解围绕这个问题的争论。

optional<T&> opt;
opt = i;
opt = j; // should this rebind or do i=j?

目前,决定是 optional<T&> 格式错误,如果任何类型是引用类型,则 variant::operator= 格式错误 - 回避争论并仍然给我们大部分功能。

opt = j 应该 重新绑定底层引用的论点是什么?换句话说,为什么应该我们这样实现optional

template <class T>
struct optional<T&> {
    T* ptr = nullptr;

    optional& operator=(T& rhs) {
        ptr = &rhs;
        return *this;
    }
};

What is the argument that opt = j should rebind the underlying reference?

我不知道 "the argument" 您要找的是什么。但是你刚刚为它展示了 "an argument":

optional<T&> opt;
opt = i;
opt = j;

现在,假设二线和三线相距很远。如果您只是阅读代码,您希望 opt = j 做什么?或者更重要的是,您为什么期望它的行为不同于 opt = i?

包装器类型的行为完全基于其当前状态而有如此大的差异将是非常令人惊讶的。

此外,我们已经有一种方式来传达您想要更改 inside optional 的值。即:*opt = j。这对 optional<T&>optional<T>.

一样有效

optional 的工作方式非常简单:它是一种包装器类型。与任何当前存在的包装器类型一样,对它们的操作会影响 wrapper,而不是被包装的东西。要影响被包装的东西,您可以显式使用 *-> 或其他一些接口函数。