为什么可选的<T&>重新分配?

Bar*_*rry 17 c++ reference optional c++17

关于参考类型应该做什么optionalvariant应该做什么一直存在争论,特别是在转让方面.我想更好地理解围绕这个问题的辩论.

optional<T&> opt;
opt = i;
opt = j; // should this rebind or do i=j?
Run Code Online (Sandbox Code Playgroud)

目前,如果任何类型是参考类型,那么决定是使形式optional<T&>不正确并variant::operator=形成格式错误 - 回避论证并仍然给我们大部分功能.

那是什么的争论opt = j 应该重新绑定相关参考?换句话说,我们为什么这样实现optional:

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

    optional& operator=(T& rhs) {
        ptr = &rhs;
        return *this;
    }
};
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 19

opt = j应该重新绑定基础引用的论点是什么?

我不知道你要找的是什么"论据".但是你刚刚提出了"争论":

optional<T&> opt;
opt = i;
opt = j;
Run Code Online (Sandbox Code Playgroud)

现在,假装第二行和第三行彼此相距很远.如果您只是阅读代码,您会期望opt = j做什么?或者更重要的是,为什么你会期望它的行为不同opt = i

要使包装类型的行为完全基于其当前状态而大不相同将是非常令人惊讶的.

此外,我们已经有一个沟通方式要改变数值optional.即:*opt = j.这适用于optional<T&>它的工作原理optional<T>.

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

  • 我发现最引人注目的最后一段 - 包装器上的操作会影响包装器.但其余的一切都有道理. (3认同)
  • @ГригорийШуренков 什么?在这种情况下,毫无疑问 `operator=` 应该做什么。它可能只意味着一件事。 (2认同)