关于optional
和variant
应该如何处理引用类型,特别是关于赋值,有一个持续不断的争论。我想更好地理解围绕这个问题的辩论。
optional<T&> opt;
opt = i;
opt = j; // should this rebind or do i=j?
opt = j
应该重新绑定底层引用的理由是什么?换句话说,为什么我们要像这样实现optional
:
template <class T>
struct optional<T&> {
T* ptr = nullptr;
optional& operator=(T& rhs) {
ptr = &rhs;
return *this;
}
};
发布于 2016-10-12 03:18:59
应该重新绑定底层引用的参数是什么?
我不知道你要找的“论点”是什么。但你刚刚提出了一个“论点”:
optional<T&> opt;
opt = i;
opt = j;
现在,假设第二行和第三行彼此相距很远。如果你只是在读代码,你希望opt = j
做什么?或者更重要的是,您为什么期望它的行为与opt = i
不同
仅仅基于包装器类型的当前状态,包装器类型的行为会有如此巨大的差异,这将是非常令人惊讶的。
此外,我们已经有了一种方法来传达您想要更改optional
中的值。即:*opt = j
。这对optional<T&>
和对optional<T>
一样有效。
optional
的工作方式非常简单:它是一个包装器类型。就像当前存在的任何包装器类型一样,对它们的操作会影响包装器,而不是被包装的东西。要影响被包装的东西,可以显式地使用*
或->
或其他一些接口函数。
https://stackoverflow.com/questions/39984443
复制相似问题