关于optional
和variant
应该对引用类型做什么,特别是有关分配的问题,一直存在争议。我想更好地理解围绕这个问题的辩论。
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;
}
};
答案 0 :(得分:19)
opt = j应重新绑定基础参考的论点是什么?
我不知道你要找的是什么“论点”。但你刚刚提出了“争论”:
optional<T&> opt;
opt = i;
opt = j;
现在,假装第二行和第三行彼此相距很远。如果您只是阅读代码,您期望opt = j
做什么?或者更重要的是,为什么你会期望它的行为与opt = i
不同?
让包装类型的行为完全不同于纯粹基于其当前状态的行为会非常令人惊讶。
此外,我们已经有了一种沟通方式,您希望更改里面的值 optional
。即:*opt = j
。这对于optional<T&>
和optional<T>
一样适用。
optional
的工作方式非常简单:它是一个包装类型。与任何当前存在的包装器类型一样,对它们的操作会影响包装器,而不会影响被包装的东西。要影响被包装的内容,请明确使用*
或->
或其他一些接口函数。