【发布时间】:2016-10-11 18:42:24
【问题描述】:
关于 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;
}
};
【问题讨论】:
-
好吧,在你的例子中,如果
opt = i绑定一个引用,然后opt = j通过引用分配,那不会觉得很奇怪吗? -
您几乎无法使用赋值绑定普通引用。
-
如果
opt是作为函数参数进来的,那就特别奇怪了,这取决于在运行时opt = i;是分配还是绑定 -
我们已经将
std::reference_wrapper与auto ref = std::ref(i); ref = j;重新绑定(由于非显式构造函数)。所以为了连贯性,重新绑定似乎更合乎逻辑。
标签: c++ reference optional c++17