Почему необязательный <T &> повторная привязка при назначении?
Продолжаются дебаты о том, что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;
}
};